【问题标题】:Symfony2 - Custom ROLESSymfony2 - 自定义角色
【发布时间】:2015-01-09 03:58:59
【问题描述】:

我正在尝试为我的 security.yml 设置自定义角色,因此登录后用户可以或无法访问主页(我使用 ActiveDirectory)。

我只想创建一个角色:ROLE_GUEST

这是我的 security.yml 文件:

role_hierarchy:
    ROLE_GUEST:       ROLE_GUEST
    ROLE_USER:        [ROLE_GUEST, ROLE_USER]
    ROLE_ADMIN:       [ROLE_GUEST, ROLE_USER, ROLE_ADMIN]
    ROLE_SUPER_ADMIN: [ROLE_GUEST, ROLE_USER, ROLE_ADMIN, ROLE_SUPER_ADMIN]

如果我理解得很好,这就是我解读这些角色的方式:

  • 具有“ROLE_GUEST”角色的用户只能看到需要“ROLE_GUEST”的页面
  • 具有“ROLE_USER”角色的用户还可以看到任何需要“ROLE_GUEST”的页面
  • “具有“ROLE_ADMIN”角色的用户还可以看到任何需要“ROLE_GUEST”和“ROLE_USER”的页面”
  • 等等……

然后,我将 access_control 设置如下:

access_control:
    - { path: ^/$, role: ROLE_USER }

我在这个 access_control 中想要的是将主页的访问权限限制为仅 ROLE_USER。当用户第一次登录时,我已经将默认角色设置为 ROLE_GUEST。但是即使我像上面那样设置 ROLE_USER,我也可以使用具有 ROLE_GUEST 的用户访问主页。

知道如何让这个工作吗?

谢谢!

【问题讨论】:

    标签: symfony roles


    【解决方案1】:

    您的正则表达式似乎是问题所在,^/$ 只匹配一个/,没有别的。我猜这就是你的意思:

    access_control:
        - { path: ^/.*, role: ROLE_USER }
    

    您的角色层次结构也可以简化:

    role_hierarchy:
        ROLE_USER:        [ROLE_GUEST] # ROLE_USER implies ROLE_GUEST
        ROLE_ADMIN:       [ROLE_USER] # ROLE_ADMIN implies ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_ADMIN] # and so on ...
    

    文档中的这个页面对于理解安全选民背后的概念非常有帮助: http://symfony.com/doc/current/cookbook/security/voters_data_permission.html

    在 symfony 2.6 中,编写自定义选民被简化:http://symfony.com/blog/new-in-symfony-2-6-simpler-security-voters

    knpuniversities youtube 频道上有一段视频介绍: https://www.youtube.com/watch?v=fF8tpdlnyaE

    【讨论】:

    • 感谢您的回答,但这不是我想要的。正如我所说,我使用 ActiveDirectory,所以每个用户都可以登录。但我不希望每个人都拥有相同的访问权限,这就是为什么我只希望 USER 访问站点而 ADMIN 访问站点 + ADMIN 部分。
    • 抱歉,我完全忽略了活动目录注释... :P 但无论如何我认为您在 access_controll 部分中的正则表达式可能是问题所在。我相应地更新了我的答案。
    • 不...我曾经遇到过这个 REGEX 问题,唯一有效的是^/$。你的,^/.* 会出现重定向错误。此外,当我设置为用户 ROLE_USER 并将主页限制为仅 ADMIN 时,它确实有效:我收到 403 - Forbidden 错误。所以我认为这更多的是自定义角色的问题(我希望)。
    • 但是^/$ 不是你真正想要的,因为它只匹配一个斜杠或者我又错过了什么?可能重定向问题是由于其他防火墙配置问题。
    • 嗯,我不确定。我知道^/.*$ 将针对所有页面,但它不起作用。防火墙下的模式设置为^/。我不确定这是否与此有关。另外,为什么当用户的角色是“USER”并且我只限制角色“ADMIN”的页面时它会起作用?
    【解决方案2】:

    好吧,我想通了。

    显然,FOS 用户包会自动将角色“用户”添加到每个用户,即使您没有在用户实体中这么说(您可以在分析器上查看)。

    因此,假设您想要一个自定义角色,请记住 ROLE_USER 将始终是较低角色,因为每个人都会拥有它。

    如果我错了,请纠正我!

    哦,我也更正了我的防火墙和 access_control(如果它可以帮助某人):

    角色层次设置:

    role_hierarchy:
            ROLE_CUSTOM:     [ROLE_USER]
            ROLE_ADMIN:       [ROLE_CUSTOM]
            ROLE_SUPER_ADMIN: [ROLE_ADMIN]
    

    防火墙设置:

    firewalls:
            main:
                pattern: ^/
    

    访问控制设置:

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin, role: ROLE_ADMIN }
        - { path: ^/, role: ROLE_CUSTOM } // IMPORTANT TO BE THE LAST ONE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 2021-07-26
      • 2021-04-03
      • 2021-07-24
      • 2011-02-10
      • 1970-01-01
      • 2020-11-20
      相关资源
      最近更新 更多