首页 文章

控制器使用Symfony 2 ACL进行视图访问

提问于
浏览
2

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

UPDATE 1 我发现ObjectIdentity接口也不是由对象创建的,而是由Ids创建的 . 这意味着我可以使用以下命令检查整个控制器类的权限:

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);

这似乎工作,我有两个用户 . 在第一次,我给了权限,使用上面的代码查看控制器的类,它工作,而没有权限设置的第二个用户获得拒绝访问异常 . 但是,我仍然需要弄清楚如何为单个控制器的操作授予权限 . 一个明显的解决方案是为每个路由条目设置一个控制器类,但这是不合理的

1 回答

  • 1

    您要求的内容没有共同的模式 . Symfony2 Security http://symfony.com/doc/current/book/security.html

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

    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中

相关问题