ACL 权限和创建新对象


ACL permissions and creating new objects

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

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

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

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

我想要发表评论,我可以检查博客文章的CREATE_COMMENT权限。对于发布新的博客文章,我可以对照类别检查CREATE_POST。但是类别之上没有任何东西,那么我将如何/检查什么来创建新类别?

或者,我是否应该根据对象类型检查它们,而不是检查父对象的 CREATE 权限?例如:

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

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

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

桑德,你是对的:要使用创建权限,你应该在"类"级别检查它们,就像你在

$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());

希望这有帮助!

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