2017-08-11 80 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