Symfony2防火墙规则未按预期工作


Symfony2 Firewall rules are not working as expected

我在security.yml配置的访问控制部分中指定了两个规则,如下所示:

 - { path: ^/logout,      role: IS_AUTHENTICATED_REMEMBERED }
 - { path: ^/admin,       role: ROLE_ADMIN }

但是在这两种情况下,用户匿名用户都可以转到两个页面,并且在工具栏中的管理员情况下,我可以看到anon.admin我做错了什么?

这些规则看起来不错,问题可能出在防火墙配置的另一部分。请张贴。

最有可能的是,您有另一个规则与规则列表中前面的这些路径匹配。例如,当您有

- { path: ^/,       role: IS_AUTHENTICATED_ANONYMOUSLY }

在规则列表的顶部,这将匹配所有路径,并且不会评估其他规则。在这种情况下,请确保将该规则移到列表的末尾。

如果不是这种情况,请扫描防火墙配置以查找使用security: false的部分,并查看模式。

然后还有"击中自己的头部"方案,其中将角色层次结构配置为允许匿名用户继承ROLE_ADMIN。但事实并非如此吧?

另请注意,当您定义像 ^/admin 这样的路径时,该路径也与 ^/administration 和所有其他以/admin 开头的路径匹配。这对您来说可能很好,但是当您想确保仅排除/admin和每个子路径(如/admin/foo)时,拥有这两个规则可能更适合您的需求:

 - { path: ^/admin$,       role: ROLE_ADMIN }
 - { path: ^/admin/,       role: ROLE_ADMIN }