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 回答
您没有在应更改的安全配置中使用正确的角色语法
至:
我已经确认'ROLE_'前缀是必需的 - 因为symfony默认使用自己的RoleVoter implementation .
要摆脱此前缀,需要自定义RoleVoter . 为此,您需要创建实现RoleVoterInterface的自定义类,使其成为服务并使用'security.voter'标记它,以强制安全层使用它而不是默认层 .
Read more about implementing own RoleVoters on this example.