我正在尝试学习Symfony角色和安全性 . 我当前的 security.yml 文件,如下所示:
role_hierarchy:
ROLE_USER: ROLE_DO_ALMOST_NOTHING
ROLE_EDITOR: [ ROLE_USER, ROLE_ALLOWED_TO_EDIT ]
ROLE_CONTRIBUTOR: [ ROLE_EDITOR, ROLE_ALLOWED_TO_CONTRIBUTE ]
ROLE_ADMIN: [ ROLE_CONTRIBUTOR ]
ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_ALLOWED_TO_DO_ANY_THING ]
access_control:
- { path: ^/admin, roles: ROLE_USER }
- { path: ^/admin/editor, roles: ROLE_ADMIN }
- { path: ^/editor, roles: ROLE_EDITOR }
- { path: ^/contributor, roles: ROLE_CONTRIBUTOR }
- { path: ^/super, roles: ROLE_SUPER_ADMIN }
我正在为我的用户使用此设置:
providers:
in_memory:
memory:
users:
person:
password: password!
roles: 'ROLE_USER'
admin:
password: password2
roles: 'ROLE_ADMIN'
这是我的问题 . 我一直在寻找安全性的access_control部分,但是,标记为 ROLE_ADMIN 的角色的路径 ^/admin/editor
将允许用户访问路由,即使person用户没有 ROLE_ADMIN 的角色 . 我想知道这是否是因为路由本身是由与 ^admin
路由相同的控制器共享的?或者有人看到我可能在代码中出错的地方,因为用户可以访问我不应该访问的路径 .
其他路线:
- { path: ^/editor, roles: ROLE_EDITOR }
- { path: ^/contributor, roles: ROLE_CONTRIBUTOR }
- { path: ^/super, roles: ROLE_SUPER_ADMIN }
按预期工作 .
1 回答
问题是您在匹配
admin/editor
之前匹配/admin
,并且只需要 ROLE_USER 角色 . 当你有:这匹配以
/admin
开头的所有内容,包括admin/editor
. 一旦Symfony找到合适的路线,它就不会检查它们中的第一个 . 所以从未达到^/admin/editor/
检查 . 试试这个:作为一个好的经验法则,您应该首先放置最细粒度/特定的路线 . 任何子路线应始终位于主路线之前 .