symfony 2中相同网址需要多个角色

时间:2013-02-10 14:05:52

标签: symfony symfony-2.1

这就是我的security.yml对于访问控制列表的看法:

access_control:
    - { path: ^/admin, roles: IS_AUTHENTICATED_FULLY }
    - { path: ^/admin, roles: ROLE_ADMIN }

我想要做的是用户必须同时具有两个角色(ROLE_ADMIN和IS_AUTHENTICATED_FULLY)才能访问定义的路径。但是根据上述规则,如果用户具有任何一个角色,则用户可以访问我不想要的路径。我也尝试过如下规则,但没有成功:

 - { path: ^/admin, roles:[ROLE_ADMIN,IS_AUTHENTICATED_FULLY] }

如何添加规则,要求用户同时拥有这两个角色才能访问定义的路径?

3 个答案:

答案 0 :(得分:1)

IS_AUTHENTICATED_FULLY

在用户实际进行身份验证时返回true。

  

匿名用户在技术上经过身份验证,这意味着   匿名用户对象的isAuthenticated()方法将返回true。   要检查您的用户是否实际经过身份验证,请检查   IS_AUTHENTICATED_FULLY角色。

因此,如果用户具有角色ROLE_ADMIN并且已登录,则他将完全通过身份验证。因此,无需设置此要求:

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

因为你有(见下文)其中包括完全认证的

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

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

将允许任何用户查看管理部分。

阅读:http://symfony.com/doc/current/book/security.html

答案 1 :(得分:1)

查看问题本身,而不是根据您的具体情况。

如果您需要用户具有访问某个路径的所有指定角色,则需要更多配置,因为如果当前安全令牌至少具有一个指定角色,则默认RoleVoter将授予访问权限。

如果令牌至少有一个已传递的角色,则

RoleVoter授予访问权限,但安全组件会将每个指定的角色分别传递给每个选民。因此,要将OR行为更改为AND行为,您需要做的就是更改分区管理器策略:

# app/config/security.yml
security:
    access_decision_manager:
        # strategy can be: affirmative (default one), unanimous or consensus
        strategy: unanimous # if any voter returns ACCESS_DENIED, access is denied

答案 2 :(得分:0)

如果我没有弄错你,我认为是等级角色 是一种更好的方法http://symfony.com/doc/current/book/security.html#hierarchical-roles)。

#Hierarchical Roles
Instead of associating many roles to users, you can define role inheritance rules by creating a role hierarchy:

YAML

app/config/security.yml
security:
    ...

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN:       ROLE_ADMIN
        ROLE_BOTH_ROLE_TOGETHER: [IS_AUTHENTICATED_FULLY,ROLE_ADMIN]

他们oyu可以检查层次结构。