我正在尝试使用 ACL,并按照建议将安全策略切换为unanimous
.
从那时起,几个 URL 不再授权我的用户访问。
但是它应该根据我的防火墙配置(我可以使用默认策略来控制它)。
我知道,如果至少有一个选民不同意,一致的策略就会拒绝访问。
所以问题是:
对于在拒绝访问的情况下的给定请求,
如何知道哪些是所涉及的选民以便知道哪个是拒绝访问?
自从将access_decision_manager策略切换为unanimous后,我遇到了同样的问题。从 Symfony 2.4 开始,表达式是默认内置的,我用它来解决这个问题。
为了让我的访问控制使用多个角色,我拥有:
access_control:
- { path: ^/, roles: [ROLE_ADMIN, ROLE_MANAGER, ROLE_EDITOR] }
改为:
access_control:
- { path: ^/, allow_if: "has_role('ROLE_ADMIN') or has_role('ROLE_MANAGER') or has_role('ROLE_EDITOR')" }
它解决了一致的问题,希望它可以帮助你或那里的任何人。
在被拒绝访问的情况下,我无法找到查看相关选民的方法,但是:
我终于找到了被拒绝的东西:使用一致的策略,当您的 security/access_control 定义针对多个角色的路由时,您的用户必须被授予所有人访问权限。其实是合乎逻辑的...
这并不能回答问题,但我认为在使用一致的安全策略时要牢记这一点。
对于您的问题:如何知道哪些是相关选民才能知道哪个拒绝访问?
答案:您应该在您的服务中搜索标签名称“security.voter”。所有安全选民都以这种方式登记。所有这些选民总是被使用。
对于部分:对于被拒绝访问的给定请求,
答案:
由于每个请求对安全投票者都有不同的方法,基于令牌,几乎不可能在没有调试的情况下查看哪个投票者拒绝了您的访问。如果你真的想知道,可以使用像 Xdebug 这样的工具来查看选民的流动情况。
您可以为您的代码进行单元测试,以查看它在某个请求时是否可以访问。