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

时间:2015-03-05 16:05:08

标签: security symfony access-control

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 个答案:

答案 0 :(得分:2)

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

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

要:

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

答案 1 :(得分:2)

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

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

Read more about implementing own RoleVoters on this example.