【问题标题】:ACL permissions and creating new objectsACL 权限和创建新对象
【发布时间】:2013-11-18 18:09:02
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: php symfony permissions acl


    【解决方案1】:

    Sander,你是对的:要使用正确的创建,你应该像在

    中那样在“类”级别检查它们
    $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());
    

    希望这会有所帮助!

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

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2013-09-30
      • 2020-11-16
      • 1970-01-01
      相关资源
      最近更新 更多