Symfony2-自定义角色

Symfony2-自定义角色,symfony,roles,Symfony,Roles,我正在尝试将自定义角色设置为我的security.yml,因此在登录后,用户可以或不能访问主页(我使用ActiveDirectory) 我只想创建一个角色:role\u GUEST 这是我的security.yml文件: role_hierarchy: ROLE_GUEST: ROLE_GUEST ROLE_USER: [ROLE_GUEST, ROLE_USER] ROLE_ADMIN: [ROLE_GUEST, ROLE_USER

我正在尝试将自定义角色设置为我的security.yml,因此在登录后,用户可以或不能访问主页(我使用ActiveDirectory)

我只想创建一个角色:role\u GUEST

这是我的security.yml文件:

role_hierarchy:
    ROLE_GUEST:       ROLE_GUEST
    ROLE_USER:        [ROLE_GUEST, ROLE_USER]
    ROLE_ADMIN:       [ROLE_GUEST, ROLE_USER, ROLE_ADMIN]
    ROLE_SUPER_ADMIN: [ROLE_GUEST, ROLE_USER, ROLE_ADMIN, ROLE_SUPER_ADMIN]
如果我理解得很好,我就是这样解读这些角色的:

  • 角色为“role\u GUEST”的用户只能看到需要“role\u GUEST”的页面
  • 角色为“role\u user”的用户也可以看到任何需要“role\u GUEST”的页面
  • “具有角色‘role_ADMIN’的用户也可以看到任何需要‘role_GUEST’和‘role_user’的页面”
  • 等等
然后,我将访问控制设置为:

access_control:
    - { path: ^/$, role: ROLE_USER }
在这个访问控制中,我想要的是将主页的访问权限限制为仅角色用户。当用户第一次登录时,我已经将默认角色设置为role\u GUEST。但是,即使我像上面那样放置了ROLE\u USER,我也可以使用具有ROLE\u GUEST的用户访问主页

你知道我该怎么做吗


谢谢

您的正则表达式似乎是问题所在,
^/$
只匹配一个
/
,其他什么都不匹配。我想这就是你的意思:

access_control:
    - { path: ^/.*, role: ROLE_USER }
此外,还可以简化角色层次结构:

role_hierarchy:
    ROLE_USER:        [ROLE_GUEST] # ROLE_USER implies ROLE_GUEST
    ROLE_ADMIN:       [ROLE_USER] # ROLE_ADMIN implies ROLE_USER
    ROLE_SUPER_ADMIN: [ROLE_ADMIN] # and so on ...
文档中的这一页对于理解安全选民背后的概念非常有帮助:

在symfony 2.6中,可以简化为编写自定义投票者:

KNP大学youtube频道有一段视频介绍:

好吧,我想出来了

显然,FOS用户包会自动将角色“用户”添加到每个用户,即使您在用户实体中没有这样说(您可以在探查器上进行检查)

因此,假设您想要自定义角色,请记住,
ROLE\u USER
将始终是较低的角色,因为每个人都会拥有它

如果我错了,请纠正我

哦,我还纠正了我的防火墙和访问控制(如果它能帮助某人):

角色层次结构设置:

role_hierarchy:
        ROLE_CUSTOM:     [ROLE_USER]
        ROLE_ADMIN:       [ROLE_CUSTOM]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN]
防火墙设置:

firewalls:
        main:
            pattern: ^/
access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, role: ROLE_ADMIN }
    - { path: ^/, role: ROLE_CUSTOM } // IMPORTANT TO BE THE LAST ONE
访问控制设置:

firewalls:
        main:
            pattern: ^/
access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, role: ROLE_ADMIN }
    - { path: ^/, role: ROLE_CUSTOM } // IMPORTANT TO BE THE LAST ONE

谢谢你的回答,但这不是我想要的。正如我所说,我使用ActiveDirectory,所以每个用户都可以登录。但我不希望每个人都有相同的访问权限,这就是为什么我只希望用户访问站点,管理员访问站点+管理员部分。对不起,我完全忽略了active directory说明…:但我认为,访问控制部分中的正则表达式可能就是问题所在。我相应地更新了我的答案。没有。。。我曾经遇到过这个正则表达式问题,唯一有效的方法是
^/$
。您的,
^/*
发生重定向错误。此外,当我设置为用户角色时,我将主页限制为仅管理,它确实起作用:我得到403-禁止的错误。所以我认为这更像是一个自定义角色的问题,而不是其他任何东西(我希望如此)。但是
^/$
不能成为您真正想要的,因为它只匹配一个斜杠,或者我又错过了什么?可能重定向问题是由于其他防火墙配置问题。嗯,我不确定。我知道
^/*$
将针对所有页面,但它不起作用。防火墙下的模式设置设置为
^/
。我不确定这是否有什么关系。还有,为什么当用户的角色是“user”并且我仅将页面限制为“ADMIN”角色时,它会起作用?