这就是我的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] }
如何添加规则,要求用户同时拥有这两个角色才能访问定义的路径?
答案 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 }
将允许任何用户查看管理部分。
答案 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可以检查层次结构。