【问题标题】:Symfony2 User permission managmentSymfony2 用户权限管理
【发布时间】:2016-06-28 05:16:03
【问题描述】:

我来找你是因为我有点担心 Symfony2 的用户管理和他们的权限。

让我解释一下:

我设置了 FOSUserBundle:

我现在想做的是权限管理。我有一个实体“发布”。 我有具有以下指定角色的用户。

ROLE_GUEST -  VIEW,RATE
ROLE_USER  -  VIEW,CREATE,RATE,EDIT_OWN
ROLE_EDITOR - VIEW,CREATE,RATE,EDIT,DELETE  

我想为每个角色设置执行某些操作的权限。

谢谢你:)

【问题讨论】:

    标签: symfony user-permissions


    【解决方案1】:

    如果我正确理解您的必要性,您希望拥有一个基于这些角色的安全层。您可以通过多种方式做到这一点:

    symfony 默认方式—— 你可以像下面的例子那样配置 symfony 的安全层

    # app/config/security.yml
    security:
    # ...
    access_control:
        - { path: ^/post/view, roles: VIEW }
        - { path: ^/post/rate, roles: RATE }
    # etc
    

    这将负责路由访问控制。更多信息http://symfony.com/doc/current/cookbook/security/access_control.html

    对于像EDIT_OWN这样更复杂的角色,你可以采取直接的方法

    if (!$post->isAuthor($this->getUser())) {
        $this->denyAccessUnlessGranted('EDIT', $post);
    
        // or without the shortcut:
        //
        // use Symfony\Component\Security\Core\Exception\AccessDeniedException;
        // ...
        //
        // if (!$this->get('security.authorization_checker')->isGranted('edit', $post)) {
        //    throw $this->createAccessDeniedException();
        // }
    } else {
        $this->denyAccessUnlessGranted('EDIT_OWN', $post);
    }
    

    对于所有这些以及更多内容,您可以查看 symfony 网站 http://symfony.com/doc/current/best_practices/security.html

    对于更高级的角色或 ACL 要求,请查看此处https://symfony.com/doc/current/components/security/authorization.html 和授权投票者https://symfony.com/doc/current/components/security/authorization.html#voters

    在我在这篇文章中提供的 4 个链接中,您应该可以找到实现 RBAC 和 ACL 所需的一切。您还可以找到有关您可能想要使用的一些注释的信息。还有一些对 symfony 安全层的扩展可能会派上用场,具体取决于您正在使用的 symfony 版本,例如 JMS\SecurityExtraBundle。

    希望对您有所帮助,

    亚历山德鲁·科索伊

    【讨论】:

    • 对于特定的东西,比如在同一实体上编辑而不是删除,使用Voters检查权限不是更好吗?
    • @Bart Bartoman 这完全取决于您的应用架构。您可以在应用程序的各个位置限制操作。这一切都取决于复杂性和所需的信息,以便决定是否允许该操作。因此,如果假设您正在开发 rest api,您可以从基于角色的路由级别开始减少访问,但是如果您想要 ACL 的东西,那么您需要首先检索 ACL 控制的数据对象,因此,在这种情况下,选民可以做到这一点。这就是为什么我在最后提到选民,以防他需要更复杂的限制规则。
    • 最后,为了优化,最好的办法是在确定访问受限后立即限制访问。在实践中,我只在我想限制低级别的东西时使用选民,具有复杂的限制规则,比如编辑实体的属性。但是,如果需要,您可以轻松地从直接方法扩展到选民。
    • @Bart Bartoman 另外,您应该尝试使您的应用程序功能尽可能简单,以保持您的应用程序熵低。因此,与其问一个复杂的问题,比如:用户可以编辑但不能删除,你可以问是否使用可以编辑。当他试图编辑时,如果一个用户在他试图删除时可以删除。这样您就可以将一个复杂的问题减少为 2 个不太复杂的问题。
    猜你喜欢
    • 2014-12-15
    • 2012-03-28
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多