Symfony 2 ACL vs Voters

时间:2013-01-08 22:08:01

标签: security symfony acl vote

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

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

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

推荐Wchich方式? 我是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 个答案:

答案 0 :(得分:4)

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

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

PS:您应该使用$object instanceof Class代替is_a($object, 'Class')