我们正在我们的平台中设置角色,其中一些角色(ROLE_VISITOR
,ROLE_REGISTERED
)拥有权限
CREATE_BLOG_POST
,CREATE_BLOG_COMMENT
Theese权限可以是true或false,但由于我们不希望它们作为新角色,而是权限,我们应该使用选民。用户也可以拥有这两种权限,或者没有权限。
我们希望允许/禁止我们的用户在允许或不允许的情况下创建博客帖子或博客评论,但是当Voters处理来自实体(所有者或非所有者)的单个项目时,我不知道怎么继续。
我们希望根据权限完全控制整个实体的CRUD。
我没有显示任何代码,因为我只尝试过DOC所说的内容...... http://symfony.com/doc/2.8/cookbook/security/voters.html但是我想要一些建议或示例代码来实现这一目标。
我希望我已经解释了一切。
答案 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;
}
}