【问题标题】:User with multiple roles, access always denied具有多个角色的用户,访问总是被拒绝
【发布时间】:2013-02-27 07:26:20
【问题描述】:

用户可能有多个角色,例如ROLE_USER, ROLE_SUBSCRIBTION_FOO, ROLE_SUBSCRIBTION_BAR.

根据他们的角色,我定义了一个访问控制列表:

    - { path: ^/admin/helpdesk/foo, roles: ROLE_SUBSCRIPTION_FOO }
    - { path: ^/admin/helpdesk/index, roles: ROLE_ADMIN } 

角色层次结构

role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUBSCRIBTION_FOO: ROLE_ADMIN
        ROLE_SUPER_ADMIN: ROLE_ADMIN

现在的问题是,当用户拥有ROLE_SUBSCRIBTION_FOO 角色并访问/admin/helpdesk/foo 时,访问被拒绝。用户同时拥有 ROLE_ADMIN 和 ROLE_SUBSCRIBTION_FOO。但是当我有

- { path: ^/admin/helpdesk/foo, roles: ROLE_ADMIN }

它有效,但我需要它

- { path: ^/admin/helpdesk/foo, roles: ROLE_SUBSCRIPTION_FOO }

哪个不起作用,但是用户确实具有角色?这有点奇怪。有什么想法吗?

【问题讨论】:

  • 您确定您正在测试的用户拥有ROLE_ADMIN 而不是ROLE_SUPER_ADMIN?因为在您的实际设置中,ROLE_SUPER_ADMIN 的用户没有ROLE_SUBSCRIBTION
  • 不,角色为 a:2:{i:0;s:10:"ROLE_ADMIN";i:1;s:21:"ROLE_SUBSCRIBTION_FOO";} 的用户是我正在测试的用户
  • 嗯,看起来是对的...您是否检查过用户在会话中是否也具有这些角色?不只在数据库中?
  • 检查数组(3) { [0]=> string(10) "ROLE_ADMIN" [1]=> string(21) "ROLE_SUBSCRIBTION_FOO" [3]=> string(9) "ROLE_USER" }
  • Awww 现在可以使用了。我删除了开发缓存,它似乎可以工作

标签: symfony fosuserbundle


【解决方案1】:

对我来说,这看起来像是一个错字。您在层次结构中定义了 ROLE_SUBSCRIBTION_FOO(带有 B),但您希望使用 ROLE_SUBSCRIPTION_FOO(带有 P)来限制路径。

【讨论】:

    【解决方案2】:

    查看设置似乎一切正常。

    我想从我的应用程序的管理区域动态更改用户角色。所以例如我将 FOO 角色授予用户 BOB,并希望更改立即生效。

    但这不起作用。不刷新用户 BOB 当前打开的会话。他必须重新验证自己的身份。重新认证(注销并再次登录)后,symfonys 安全系统将正确地比较角色与给定的访问列表。

    所以我希望用户会话能够自动更新,但这对于 symfony 的默认安全系统是不可能的。我认为它需要使用基于数据库的会话管理进行扩展。这样您就可以刷新用户会话。

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 2018-08-21
      • 1970-01-01
      相关资源
      最近更新 更多