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等),因为我正在为现有数据库编写应用程序,其中包含已为用户定义的角色,因此我想使用它们。
答案 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.