Symfony2 ACL 结合另一个标准

标签 symfony acl

我想知道是否有人知道使用 Symfony2 ACL 系统实现这一目标的优雅方法。

我有一个 Comment需要由 ROLE_USER 编辑的实体(我的域对象)但这只能在发表评论后的 5 分钟内进行 - 否则评论只能由 ROLE_ADMIN 编辑.

使其只能由 ROLE_USER 编辑和 ROLE_ADMIN很简单,做一个RoleSecurityIdentity对于每个。

现在,当我想合并 ROLE_USER 的时间因素时,我的问题就出现了。 .我的第一个问题是它需要来自域对象的信息,而不仅仅是 ACL 表,但我认为这可以通过自定义 ObjectIdentity 来解决。 class里面还可以容纳Comment的时间被张贴。

现在是困难的部分

我想我需要创建一个自定义 PermissionGrantingStrategy知道还要查看创建时间。这必须在 Comment 时加载正在检查类型,但我不知道如何加载它。有谁知道是否有某种工厂可以配置这种东西?这样如果一个实体有一个特定的 PermissionGrantingStrategy与它相关联然后它被使用,否则使用默认值?

我知道这有点长,如果有人知道如何实现这一点,非常感谢,因为 ACL 文档目前似乎有点稀疏。我的后备解决方案是简单地提供某种服务来检查是否可以编辑评论,而根本不打扰 ACL。

最佳答案

你考虑过使用选民吗?有一个 cookbook recipe用于实现 IP 黑名单投票器,但可以轻松修改它以处理对 Comment 对象的编辑检查。

您可以在 Symfony\Component\Security\Acl\Voter\AclVoter 查看默认的 AclVoter (在线 here),虽然你的显然可以增加而不是替换它并且更简单。

作为概念的快速证明:

class CommentTimestampVoter implements VoterInterface
{
    public function supportsAttribute($attribute)
    {
        return 'edit' === $attribute;
    }

    public function vote(TokenInterface $token, $object, array $attributes)
    {
        // 1. check if $token->getUser() has ROLE_ADMIN and return VoterInterface::ACCESS_GRANTED if so
        // 2. check if $token->getUser() equals $object->getAuthor() and return VoterInterface::ACCESS_DENIED if not
        // 3. check that $object->getCreatedAt() is within the window allowed for editing and return VoterInterface::ACCESS_GRANTED if so
        // 4. return VoterInterface::ACCESS_DENIED
    }

    public function supportsClass($class)
    {
        return 'Acme\CommentBundle\Entity\Comment' === $class;
    }
}

关于Symfony2 ACL 结合另一个标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7879173/

相关文章:

cakephp 3 中的授权和 ACL

grails - 如何为同一实例上的不同用户授予不同的权限

Symfony2/Doctrine2 刷新实体管理器时抛出索引错误

spring - spring security中的最佳实现 'Access'用户

html - html中的空格选择选项

symfony - 在 symfony2 中获取客户端 ip 和客户端位置

rest - 使用composer-rest-server资源管理器和多用户身份验证来发布新身份

java - Spring ACL 是一个好的 ACL 实现吗?

php - symfony的测试和浏览器有什么区别

mongodb - Symfony2 + DoctrineMongoDBBundle 配置