Symfony 忽略 fosuser 自定义角色

Posted

技术标签:

【中文标题】Symfony 忽略 fosuser 自定义角色【英文标题】:Symfony ignores fosuser custom roles 【发布时间】:2016-08-15 23:01:13 【问题描述】:

所以,这是我的 security.yml

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_CLINICIAN:   ROLE_USER
        ROLE_ADMIN:       ROLE_CLINICIAN
        ROLE_OWNER:       ROLE_ADMIN
        ROLE_SUPER_ADMIN: ROLE_OWNER

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            pattern: ^/
            form_login:
                provider:       fos_userbundle
                csrf_provider:  security.csrf.token_manager
            logout:    true
            anonymous: ~

    access_control:
        -  path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY 
        -  path: ^/resetting, roles: IS_AUTHENTICATED_ANONYMOUSLY 
        -  path: /, roles: ROLE_USER 
        -  path: ^/, roles: ROLE_ADMIN 
        -  path: ^/api, roles: ROLE_OWNER 
        -  path: ^/api, roles: ROLE_SUPER_ADMIN 
        -  path: ^/api/clinics, roles: ROLE_CLINICIAN 

我应该有这样的角色层次结构

 ROLE_CLINICIAN
       |
   ROLE_ADMIN
       |
   ROLE_OWNER
       |
ROLE_SUPER_ADMIN

但是 symfony 忽略了它,现在我想让 ROLE_CLINICIAN 只能访问 path: ^/api/clinics 页面,但是这个角色仍然可以访问每个页面

【问题讨论】:

【参考方案1】:

这是可行的解决方案

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_CLINICIAN
        ROLE_OWNER:       ROLE_ADMIN
        ROLE_SUPER_ADMIN: ROLE_OWNER

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        main:
            pattern: ^/
            form_login:
                provider:       fos_userbundle
                csrf_provider:  security.csrf.token_manager
            logout:
                path:   fos_user_security_logout
                target: fos_user_security_login
            anonymous: ~

    access_control:
        -  path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY 
        -  path: ^/resetting, roles: IS_AUTHENTICATED_ANONYMOUSLY 
        -  path: ^/api/clients, roles: ROLE_CLINICIAN 
        -  path: ^/api, roles: ROLE_SUPER_ADMIN 
        -  path: ^/api, roles: ROLE_OWNER 
        -  path: ^/#/, roles: ROLE_USER 

path: ^/ 允许访问我的应用程序中的所有页面,因此 ROLE_USER 的每个父级都可以访问每个页面,但是通过http://symfony.com/doc/current/cookbook/security/access_control.html

Remember, the first rule that matches is used,所以诀窍是将 - path: ^/#/, roles: ROLE_USER 放在列表末尾。

【讨论】:

【参考方案2】:

访问控制规则从上到下进行评估。第一个匹配的访问控制规则获胜。在您的示例中,这意味着永远不会考虑最后四个规则。由于ROLE_CLINICIAN 角色包含ROLE_USER 角色,您的用户将始终被授予访问权限。

您可以阅读有关如何评估访问控制规则的更多信息in the documentation。

【讨论】:

以上是关于Symfony 忽略 fosuser 自定义角色的主要内容,如果未能解决你的问题,请参考以下文章

已使用“FOSUser Bundle”登录的用户的“角色提升”,无需先注销

从 Symfony 3.4 迁移到 Symfony 4.4 后,自定义投票器无法按预期工作

自定义 Symfony2 过滤器未使用自定义树枝标签触发

Symfony2:如何实现自定义用户登录和注册——摆脱 FOSUSerBundle

Symfony 4/JMS/FOSUser:无法从 FOS\UserBundle 序列化数据

Symfony 3 - 我在管理角色方面遇到了一些困难