ACL权限和创建新对象

时间:2013-11-07 07:24:14

标签: php symfony permissions acl

我正在使用自定义选民(而不是内置的通用ACL系统)构建具有访问控制的Symfony2应用程序。检查权限通常如下所示:

$this->isGranted('EDIT', $someObject);

告诉我当前用户是否可以编辑该对象。但是我应该如何处理检查权限以创建新对象?

假设一个类似博客的系统。我有类别,有帖子,有评论。我可以通过传入实际对象来检查VIEW,EDIT和DELETE权限,但是如何检查是否允许用户创建新的评论,帖子或类别?

我想评论我可以针对博客文章检查CREATE_COMMENT权限。为了发布新的博客帖子,我可以针对该类别检查CREATE_POST。但是这个类别之上没有任何内容,那么我将如何/如何检查创建新类别?

或者,我应该根据对象的类型检查它们,而不是检查父对象的CREATE权限吗? E.g:

$isGranted('CREATE', 'My\Bundle\Entity\Comment');

看起来不错,但没有考虑用户想要评论的帖子。

在尽可能多的框架和语言中有大量的ACL系统。如何处理对象创建权限?

1 个答案:

答案 0 :(得分:2)

桑德,你是对的:要正确使用创造,你应该在“等级”级别检查它们

$securityContext->isGranted('CREATE', 'My\Bundle\Entity\Comment');

您是否了解如何创建ACL规则? 我更喜欢问,因为它在SF2文档中没有明确规定。文档仅说明如何设置对象特定的ACE,而不是特定于类的ACE。

作为一个起点,你应该做(假设你在控制器中):

$aclProvider = $this->get('security.acl.provider');
$acl = $aclProvider->createAcl(new ObjectIdentity('class', 'My\Bundle\Entity\Comment');
$builder = new MaskBuilder();
$builder->add('create');
// Can be changed to
// $securityIdentity= UserSecurityIdentity::fromAccount($user);
$securityIdentity = new UserSecurityIdentity($user->getUsername(), 'My\Bundle\Entity\User');
$acl->insertClassAce($securityIdentity, $builder->get());

希望这有帮助!

编辑:犯了一些复制/粘贴错误,并在示例中添加了更多