首页 文章

Symfony访问控制禁止用户具有正确的角色

提问于
浏览
0

security.yml:

role_hierarchy:
    admin: [test, simple]

providers:
    database:
        entity: { class: UserBundle:User, property: username }

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

    prod:
        pattern: ^/
        provider: database
        anonymous: true
        form_login:
            login_path: public_login
            check_path: public_login_check
            default_target_path: dashboard
            always_use_default_target_path: true
            csrf_provider: form.csrf_provider
        logout:
            path: logout
            target: public_login

access_control:
    - { path: ^/(.+), roles: admin }
    - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }

当我登录时,我得到403禁止例外 . 然后我检查profiler / security,角色看起来像这样:

Roles   [ROLE_USER, admin]

当我将访问控制切换到:

- { path: ^/(.+), roles: ROLE_USER }

它工作正常 .

为什么我的访问控制不允许我访问具有“admin”角色的页面,但是使用“ROLE_USER”?

我的目标是删除内置角色(如ROLE_USER,ROLE_ADMIN等),因为我正在为现有数据库编写应用程序,其中包含已为用户定义的角色,因此我想使用它们 .

2 回答

  • 2

    您没有在应更改的安全配置中使用正确的角色语法

    - { path: ^/(.+), roles: admin }
    

    至:

    - { path: ^/(.+), roles: ROLE_ADMIN }
    
  • 2

    我已经确认'ROLE_'前缀是必需的 - 因为symfony默认使用自己的RoleVoter implementation .

    要摆脱此前缀,需要自定义RoleVoter . 为此,您需要创建实现RoleVoterInterface的自定义类,使其成为服务并使用'security.voter'标记它,以强制安全层使用它而不是默认层 .

    Read more about implementing own RoleVoters on this example.

相关问题