控制器';s使用Symfony 2 ACL进行查看访问

控制器';s使用Symfony 2 ACL进行查看访问,symfony,acl,Symfony,Acl,我需要一种方法来使用Symfony 2.1实现一个权限列表(内置的权限映射应该很好),它应该充当全局权限。我要做的是限制组或用户可以看到的视图。例如,我有两个控制器(controllerA和controllerB)和两个用户(userA和userB)。第一个用户应该能够看到controllerA管理的视图,但他不应该能够查看controllerB的视图。相反,userB应该能够同时看到这两个控制器。我在Symfony的书/食谱中找到了关于ACL的教程,但它似乎只讨论应用于实体的权限,而控制器不是

我需要一种方法来使用Symfony 2.1实现一个权限列表(内置的权限映射应该很好),它应该充当全局权限。我要做的是限制组或用户可以看到的视图。例如,我有两个控制器(controllerA和controllerB)和两个用户(userA和userB)。第一个用户应该能够看到controllerA管理的视图,但他不应该能够查看controllerB的视图。相反,userB应该能够同时看到这两个控制器。我在Symfony的书/食谱中找到了关于ACL的教程,但它似乎只讨论应用于实体的权限,而控制器不是实体。有什么建议吗

更新1 我发现ObjectIdentity接口也可以通过ID而不是对象来创建。这意味着我可以使用以下方法检查整个控制器类的权限:

class MyController extends Controller
{
    public function getId()
    {
        return 'my_controller';
    }

    public function indexAction()
    {
        if ($this->get('security.context')->isGranted('MY_PERMISSION', $this) === false)
        {
            throw new AccessDeniedException();
        }

        ...
    }
}
并使用以下代码在数据库中插入acl条目:

$aclProvider = $this->get('security.acl.provider');
$objectIdentity = ObjectIdentity::fromDomainObject($this);
$acl = $aclProvider->createAcl($objectIdentity);

$securityContext = $this->get('security.context');
$user = $securityContext->getToken()->getUser();
$securityIdentity = UserSecurityIdentity::fromAccount($user);

$builder = new MaskBuilder();
$builder->add('MY_PERMISSION');
$mask = $builder->get();

$acl->insertObjectAce($securityIdentity, $mask);
$aclProvider->updateAcl($acl);

这似乎有效,我有两个用户。第一次,我用上面的代码授予了查看控制器类的权限,该类可以正常工作,而第二个未设置权限的用户会得到拒绝访问异常。但是,我仍然需要弄清楚如何为单个控制器的操作授予权限。一个显而易见的解决方案是为每个路线入口设置一个控制器类,但这是不合理的

对于您的请求没有通用模式。Symfony2安全性

您是否建议在授予对操作的访问权限之前只检查用户角色或组

if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) {
        throw new AccessDeniedException();
}
该异常可能会呈现一些自定义错误页面

那么:

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, role: ROLE_USER } 

在你的security.yml中,如果我要检查角色,我应该有很多角色,每个控制器操作一个。相反,我将拥有一种类似于VIEW_CONTROLLER的权限,并将其应用于每个控制器。我需要做一些像joomla permissions这样的事情,在这里你可以定义用户/组可以看到的管理面板的内容,这应该只是编写ISPermisted部分的不同方法。我总是检查角色。我不明白的是如何将角色授予该特定控制器的用户。如果我正确理解了控制器的工作原理,那么它应该是域对象,但它不是保存在数据库中的东西。我认为在调用控制器之前,应该在引导方法中的某个位置执行此操作,不过这是对symfony core的某种黑客攻击