【问题标题】:Controller's view access with Symfony 2 ACL使用 Symfony 2 ACL 访问控制器的视图
【发布时间】:2012-10-01 05:14:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: symfony acl


    【解决方案1】:

    您的请求没有通用模式。Symfony2 安全 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 中

    【讨论】:

    • 如果我要检查角色,我应该有很多角色,每个控制器操作一个。相反,我将拥有一种类似 VIEW_CONTROLLER 的权限并将其应用于每个控制器。我需要做类似 joomla 权限之类的事情,您可以在其中定义用户/组可以在管理面板中看到的内容
    • 这应该只是编写 isGranted 部分的不同方法。我总是检查角色。我不明白的是如何将角色授予该特定控制器的用户。如果我正确理解它的工作原理,控制器应该是域对象,但它不是保存在数据库中的东西。
    • 我认为这应该在调用控制器之前在引导方法中的某个地方完成,但是这是对 symfony 核心的某种入侵
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2013-03-20
    • 2012-10-26
    • 1970-01-01
    相关资源
    最近更新 更多