2016-06-18 127 views
0

我有這個role_hierarchy:如何構建角色層次結構中的Symfony

role_hierarchy: 
    ROLE_USER:  [ROLE_EDITOR, ROLE_WEBSITE] 
    ROLE_ADMIN:  ROLE_USER 

然後

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: ROLE_ADMIN } 
    - { path: ^/, role: ROLE_USER } 

非註冊用戶應該能夠訪問到登錄頁面, 管理員應該使用註冊頁面(我只希望管理員能夠添加新用戶),註冊用戶(編輯或網站)應該看到主頁(/)

現在,如果我是用戶EDITOR,並且我保護資源與

{% if is_granted('ROLE_WEBSITE') %} 

我可以看到資源,但這不是我想要的。其實在剖析器中我可以看到:

Roles [ROLE_EDITOR, ROLE_USER] 
Inherited Roles [ROLE_EDITOR, ROLE_WEBSITE] 

所以編輯器用戶正在繼承ROLE_WEBSITE角色。我該如何解決這個問題?

感謝 中號

充分security.yml

security: 
encoders: 
    FOS\UserBundle\Model\UserInterface: bcrypt 

role_hierarchy: 
    ROLE_USER:  [ROLE_EDITOR, ROLE_WEBSITE] 
    ROLE_ADMIN:  ROLE_USER 

providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username_email 

firewalls: 
    main: 
     pattern: ^/ 
     form_login: 
      provider: fos_userbundle 
      csrf_token_generator: security.csrf.token_manager 

     logout:  true 
     anonymous: true 
     guard: 
      authenticators: 
       - app.token_authenticator 

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: ROLE_ADMIN } 
    - { path: ^/, role: ROLE_USER } 
+0

你需要發表您的全'應用程序/配置/ security.yml'的文件給我們看所有角色信息。 –

+0

已更新。謝謝 – user3174311

+0

你使用的是FOSUserBundle嗎? –

回答

0

嘗試幾次後我解決了改變heiriarchy到

role_hierarchy: 
    ROLE_USER:  ROLE_EDITOR 
    ROLE_USER:  ROLE_WEBSITE 
    ROLE_ADMIN:  ROLE_USER 
0

第一)登錄到MySql(即mysql -u uname -p其中UNAME是用戶嘗試 '根')。

2日)運行該SQL:

SELECT id,username,roles FROM fos_user; 

這將顯示給每個用戶的所有角色。然後你可以看到誰有「ROLE_EDITOR」和「ROLE_WEBSITE」。然後退出mysql。

使用以下(例子)來管理特定用戶:

php bin/console fos:user:promote uname ROLE_EDITOR 
php bin/console fos:user:demote uname ROLE_EDITOR 

而且,由於ROLE_EDITOR & ROLE_WEBSITE聽起來像是應低於ROLE_USER,我認爲你需要這種變化:

access_control: 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: ROLE_ADMIN } 
    - { path: ^/, role: [ROLE_EDITOR,ROLE_WEBSITE] } 

我認爲這可能會奏效。嘗試一下。 如果沒有,也許你可以根據路徑前綴過濾更多。 希望這有助於。