我读到了这个问题:Symfony2 access control with routes
所以
我已根据http://symfony.com/doc/current/cookbook/security/voters.html的说明创建了一个自定义投票人。
这是我对选民的服务定义
xml_menu:
class: "%xml_menu.v1.class%"
arguments: [""]
route_voter:
class: "%route_voter.class%"
arguments: [@request_stack, @xml_menu ]
public: false
tags:
- { name: security.voter }
这是我的防火墙配置:
test_secured_area:
pattern: ^/test/
form_login:
check_path: _demo_security_check
login_path: _demo_login
logout:
path: _demo_logout
target: _demo
access_control:
我故意使用演示登录路径并将access_control留空。
我已经手动测试了' route_voter'服务,并知道它的工作原理。但是它的加载方法不会在任何请求上自动调用。这种行为应该是,我必须每次调用安全上下文的isGranted()
方法,例如在我的控制器的开头还是我做错了什么?
如果这是它应该工作的方式,我如何强制在每个请求上调用选民。
我试图在这里实现的行为类似于access_control,如果用户有权访问路线,则选民返回VoterInterface::ACCESS_GRANTED
,否则返回VoterInterface::ACCESS_DENIED
。我希望访问控制限制基于此。
目前发生的是我每次尝试访问/ test / foo时都被重定向到登录页面,当我登录时,我被重定向到hostname /。然后,每当我尝试访问/ test / foo时,我都会重定向到演示登录页面。但是,当我访问演示安全区域时,它显示我已经过身份验证。所以我必须激活/测试/ * symfony读取会话和验证我的路径,所以我没有重定向回登录页面?
答案 0 :(得分:0)
问题在于检查路径。如果在http://symfony.com/doc/current/book/security.html中声明登录表单的身份验证是针对 check_path 上下文完成的>路由正在进行。所以验证发生在演示防火墙而不是我创建的防火墙上。所以要修复它我做了两件事
另一种解决方案是通过为它们提供相同的名称来共享其防火墙上下文。