2017-08-11 79 views
1

我正在尝试学习Symfony角色和安全性。我现在security.yml文件,如下所示:Symfony角色和安全解释

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将允许用户访问路由,即使该用户不具有角色ROLE_ADMIN 。我想知道这是否是因为路由本身由与^admin路由相同的控制器共享?或者做了一个人,看看我的代码出错了,因为用户可以访问我不应该访问的路线。

其他路线:如预期

- { path: ^/editor, roles: ROLE_EDITOR } 
- { path: ^/contributor, roles: ROLE_CONTRIBUTOR } 
- { path: ^/super, roles: ROLE_SUPER_ADMIN } 

工作。

+0

你好 - 我的答案是否解决了你的问题? –

回答

2

问题是你匹配/admin之前你匹配admin/editor,并且只需要ROLE_USER角色。当你有:

- { path: ^/admin, roles: ROLE_USER } 

匹配与/admin开始,包括admin/editor一切。只要Symfony找到合适的路线,它不会检查第一个路线。 所以你的^/admin/editor/检查永远不会到达。试试这个:

access_control: 
    - { path: ^/admin/editor, roles: ROLE_ADMIN } 
    - { path: ^/admin, roles: ROLE_USER } 
    - { path: ^/editor, roles: ROLE_EDITOR } 
    - { path: ^/contributor, roles: ROLE_CONTRIBUTOR } 
    - { path: ^/super, roles: ROLE_SUPER_ADMIN } 

作为一个很好的经验法则,你应该把最细粒度/特定的路线放在第一位。任何子路线应始终放在主路线之前。

+0

是的。谢谢 – Kaley36