当我通过常规方式验证时(使用登录表单),它可以正常工作。我只有在通过GET方法直接访问/check_form
时才会收到此错误,在这种情况下会抛出异常:
您必须使用安全防火墙配置中的form_login配置防火墙处理的检查路径。
以下是相关的security.yml
部分:
firewalls:
acme_area:
pattern: ^/(acme|admin)/
provider: fos_userbundle
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
login_path: acme_login
check_path: /acme/login_check
logout:
path: /acme/logout
target: acme_login
anonymous: true
我使用2.3,因此没有methods
选项适用(虽然我不知道它是否会有所帮助)。
这不是一个真正的问题,因为这个错误不能破坏正确的用法,但是当一些勤奋的僵尸程序访问该站点时它会污染错误日志而且它只是不整洁。所以,我想知道我可以改变哪个配置选项来摆脱这个错误。
要把它煮沸,似乎我想要抛出一些4xx错误而不是500.理想情况下它应该是405 Method Not Allowed
,但404
也是冷的。
修改
正如我从Alex的答案中了解到的那样,这是因为POST请求由防火墙处理,而控制器发出GET请求。因此,似乎必须扩展默认checkAction()
才能处理两种情况:
答案 0 :(得分:8)
没有配置选项。如果请求到达控制器,它将无条件地抛出异常:credible source。
对路由的 POST
请求由防火墙处理:official docs; GET
像往常一样去控制器。
如果你不关心这些事件,几乎没有办法摆脱日志中的错误。在我看来,最简单的是覆盖SecurityController::checkAction
以返回500错误而不抛出异常。官方文档如何实现它:Overriding Default FOSUserBundle Controllers。
修改强>
在控制器中,您可以返回您喜欢的任何代码:
public function checkAction()
{
return new Response('', 418); // or better use Response constants
}
另一种方法是在路由配置中禁用GET方法/acme/login_check
,让路由器完成其工作并像往常一样返回正常405 Method Not Allowed
。
<强> EDIT2:强>
您可以在操作中分析请求,但仍会抛出异常:
public function checkAction(Request $request)
{
if ($request->getMethod() == Request::METHOD_POST) {
throw new \RuntimeException('You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.');
} else {
return new Response('', Response::HTTP_METHOD_NOT_ALLOWED);
}
}
但我建议调试您的路线。该逻辑应该属于路由器,而不是控制器。从长远来看,您的路由配置会误导将维护此代码的开发人员,并且当405
清楚地指出{{1}时,他们将有几个艰难的调试时间试图找出它返回app/console debug:router
的原因。允许使用方法。