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

Symfony access control forbids user with correct role

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 forbidden 异常。然后我检查 profiler/security,角色看起来像这样:

Roles   [ROLE_USER, admin]

当我将访问控制切换为:

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

它工作正常。

为什么我的访问控制不允许我访问具有 "admin" 角色的页面,但允许我访问具有 "ROLE_USER" 的页面?

我的目标是放弃内置角色(如 ROLE_USER、ROLE_ADMIN 等),因为我正在为现有数据库编写应用程序,其中包含已经为用户定义的角色,所以我想使用它们。

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

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

收件人:

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

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

要去掉这个前缀,需要自定义 RoleVoter。为此,您需要创建自定义 class 实现 RoleVoterInterface,使其服务并使用 'security.voter' 标记,以强制安全层使用它而不是默认层。

Read more about implementing own RoleVoters on this example.