Symfony2选民对整个实体的权限

时间:2016-03-01 15:24:20

标签: php symfony

我们正在我们的平台中设置角色,其中一些角色(ROLE_VISITORROLE_REGISTERED)拥有权限

CREATE_BLOG_POSTCREATE_BLOG_COMMENT

Theese权限可以是true或false,但由于我们不希望它们作为新角色,而是权限,我们应该使用选民。用户也可以拥有这两种权限,或者没有权限。

我们希望允许/禁止我们的用户在允许或不允许的情况下创建博客帖子或博客评论,但是当Voters处理来自实体(所有者或非所有者)的单个项目时,我不知道怎么继续。

我们希望根据权限完全控制整个实体的CRUD。

我没有显示任何代码,因为我只尝试过DOC所说的内容...... http://symfony.com/doc/2.8/cookbook/security/voters.html但是我想要一些建议或示例代码来实现这一目标。

我希望我已经解释了一切。

1 个答案:

答案 0 :(得分:1)

这里有一个没有其他实体的例子:

<?php
namespace AppBundle\Voters;

use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class BlogVoter  implements VoterInterface
{
    const CREATE_BLOG_COMMENT = 'create_blog_comment';   
    const CREATE_BLOG_POST = 'create_blog_post';     

    public function vote(TokenInterface $token, $object, array $attributes)
    {    
        $user = $token->getUser();

        $supports = false;
        foreach($attributes as $attribute){
            if(in_array($attribute,array(self::CREATE_BLOG_COMMENT,self::CREATE_BLOG_POST))){
                $supports = true;
            }
        }

        if(!$supports){
            return self::ACCESS_ABSTAIN;
        }

        if ($user instanceof UserInterface) {
            $roles = $user->getRoles();

            switch($attribute) {
                case self::CREATE_BLOG_COMMENT:
                    if(in_array('ROLE_VISITOR',$roles)|| in_array('ROLE_REGISTERED',$roles)){
                        return self::ACCESS_GRANTED;
                    }
                break;
                case self::CREATE_BLOG_POST:
                    if(in_array('ROLE_REGISTERED',$roles)){
                        return self::ACCESS_GRANTED;
                    }
                break;
            }
        }

        return self::ACCESS_DENIED;
    }
}