2016-06-18 130 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] } 

我认为这可能会奏效。尝试一下。 如果没有,也许你可以根据路径前缀过滤更多。 希望这有助于。