Symfony 2 ACL 与选民

Posted

技术标签:

【中文标题】Symfony 2 ACL 与选民【英文标题】:Symfony 2 ACL vs Voters 【发布时间】:2013-01-08 22:08:00 【问题描述】:

我想使用 isGranted('EDIT', $userObject) 来允许所有管理员和经理以及那个用户编辑给定的用户数据。

我应该使用 ACL 来控制编辑 $userObject 吗? 我已经编写了额外的 Voter 来检查登录的用户和给定的对象是否相同或者用户是经理或管理员。

在 acl 中,我必须为所有管理员、经理和那个用户添加 userObject 的 ACE。

推荐哪种方式? 我是 Symfony 的新手..

以下是选民代码:

function vote(TokenInterface $token, $object, array $attributes)

    $intersect=array_intersect(array('EDIT','VIEW' ), $attributes);
    if (!empty($intersect))
    
        //intersect is not empty, it seems to edit or view are in $attributes
        //voter grants privileges for [user->granted object]
        //manager->every customer, child-manager
        //admin->every customer and manager
        if ($token->getUser()->isAdmin())
        
            return VoterInterface::ACCESS_GRANTED;
        
        elseif ($token->getUser()->isCustomer())
        
            //voter not want to think about customer grants, because customer grants currently are held in ACL
            return VoterInterface::ACCESS_ABSTAIN;
        
        /* @var $object \PSB\StoreBundle\Entity\Customer */
        if (is_a($object, '\PSB\StoreBundle\Entity\Customer'))
        

            if ($token->getUser()->isManager())
            
                //managers also edit customers
                return VoterInterface::ACCESS_GRANTED;
            
        
        elseif (is_a($object, '\PSB\StoreBundle\Entity\Manager'))
        
            /* @var $object \PSB\StoreBundle\Entity\Manager */
            if ($token->getUser()->isManager())
            
                //manager can edit own children
                if ($token->getUser() == $object->getParent())
                
                    return VoterInterface::ACCESS_GRANTED;
                
            
        
    
    return VoterInterface::ACCESS_ABSTAIN;

【问题讨论】:

【参考方案1】:

当您的模型已经存储了知道是否应该授予操作所需的数据时,让 ACL 与您的真实数据保持同步真的很烦人。

所以你显然应该为此实现自己的选民。

PS:你应该使用$object instanceof Class 而不是is_a($object, 'Class')

【讨论】:

也感谢 instanceof 提示:P 顺便说一句,我可以将类作为参数传递吗?使用\我的\包\类; -- function_getting_class_param(Class); 我知道这是一个旧的 SO,但天哪,它仍然是一个很好且相关的答案。

以上是关于Symfony 2 ACL 与选民的主要内容,如果未能解决你的问题,请参考以下文章

在 symfony ACL 中禁用对象身份检查

为啥 symfony2 安全选民总是被召唤?

Symfony2 自定义选民:无法从选民内部访问 getDoctrine

如何通过伪造登录来测试 Symfony 2 中的 ACL

在 Symfony Messenger 异步消息处理程序上使用选民/权限的最佳方式? [关闭]

Symfony 2 acl isFieldGranted 抛出异常