Symfony - 安全战略一致表明选民参与

时间:2013-06-11 09:23:21

标签: security symfony acl firewall

我正在尝试使用ACL,并且根据建议我将安全策略切换为unanimous

此后,多个网址不授权我的用户再访问。
但是它应该根据我的防火墙配置(我能够使用默认策略控制它)。

我理解,如果至少有一位选民不批准,一致的策略会拒绝访问。

所以问题是:

对于拒绝访问的特定请求,
如何知道哪些是参与选民,以便知道哪一个拒绝访问?

3 个答案:

答案 0 :(得分:2)

自从将 access_decision_manager 策略转换为一致后,我遇到了同样的问题。从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')" }

它解决了一致的问题,希望它可以帮助你或那里的任何人。

答案 1 :(得分:0)

在被拒绝访问的情况下,我无法找到相关选民的方法,但是:

我终于找到了被拒绝的内容:使用一致的策略,当您的security / access_control定义针对多个角色的路由时,必须授予您的所有用户访问权限。这实际上是合乎逻辑的......

这不能回答这个问题,但我认为在使用一致的安全策略时要记住这一点。

答案 2 :(得分:0)

对于你的问题:如何知道哪些参与选民才知道哪一个拒绝访问?

答案:您应该在服务中搜索标签名称“security.voter”。 所有安全选民都以这种方式登记。 所有这些选民都被使用。

对于以下部分:对于拒绝访问的给定请求,

答案:

由于每个请求对安全选民采用不同的方法,基于令牌,几乎不可能看到哪个选民在没有调试的情况下拒绝您访问。如果你真的想知道的话,可以使用像Xdebug这样的工具来查看选民的流动。

您可以对代码进行单元测试,以查看在某个请求时是否可以访问它。