4

这就是我的 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] }

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

4

3 回答 3

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

于 2013-02-10T14:20:07.747 回答
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
于 2014-04-11T08:24:49.930 回答
-1

如果我没有误会你,我认为分层角色
是更好的方法http://symfony.com/doc/current/book/security.html#hierarchical-roles)。

#分层角色
您可以通过创建角色层次结构来定义角色继承规则,而不是将许多角色与用户相关联:

YAML

应用程序/配置/security.yml
安全:
    ...

    角色层次结构:
        ROLE_ADMIN:ROLE_USER
        ROLE_SUPER_ADMIN:ROLE_ADMIN
        ROLE_BOTH_ROLE_TOGETHER:[IS_AUTHENTICATED_FULLY,ROLE_ADMIN]

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

于 2016-02-19T17:45:49.713 回答