Php 如何摆脱;您必须配置防火墙要处理的检查路径";GET请求出错?
当我以通常的方式(使用登录表单)进行身份验证时,它可以正常工作。仅当通过GET方法直接访问Php 如何摆脱;您必须配置防火墙要处理的检查路径";GET请求出错?,php,symfony,fosuserbundle,Php,Symfony,Fosuserbundle,当我以通常的方式(使用登录表单)进行身份验证时,它可以正常工作。仅当通过GET方法直接访问/check\u form时,我才会收到此错误,在这种情况下,会引发异常: 您必须在安全防火墙配置中使用form_登录配置防火墙要处理的检查路径 以下是相关的security.yml部分: firewalls: acme_area: pattern: ^/(acme|admin)/ provider: fos_userbundle form_lo
/check\u form
时,我才会收到此错误,在这种情况下,会引发异常:
您必须在安全防火墙配置中使用form_登录配置防火墙要处理的检查路径
以下是相关的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,因此没有适用的方法
选项(尽管我不知道它是否有用)
这不是一个真正的问题,因为没有正确的使用可能会被这个错误破坏,但它污染了错误日志时,一些勤奋的机器人正在访问该网站,它只是不整洁。所以,我想知道我可以更改哪个配置选项来消除这个错误
归结起来,我似乎希望抛出一些4xx错误,而不是500。理想情况下,不允许使用405方法
,但也应使用404方法
编辑:
正如我从下面Alex的回答中了解到的,这是因为POST请求是由防火墙处理的,并且由控制器获取请求。因此,似乎必须扩展defaultcheckAction()
才能处理两种情况:
当请求为POST但不存在防火墙条目时(已为nandled)
存在防火墙条目但请求为GET时(我的案例)
没有相应的配置选项。如果请求到达控制器,则无条件抛出异常:
POST
对路由的请求由防火墙处理:<代码>获取
像往常一样,一个到控制器
如果您不关心这样的事件,那么很少有选项可以消除日志中的错误。我认为最简单的方法是重写SecurityController::checkAction
以返回500个错误,而不引发异常。官方文件说明了如何实现它:
编辑:
在控制器中,您可以返回您喜欢的任何代码:
public function checkAction()
{
return new Response('', 418); // or better use Response constants
}
另一种方法是在路由配置中禁用GET方法到/acme/login\u check
,并让路由器完成其工作,并像往常一样返回正常的405方法不允许
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
,,当app/console debug:router
明确声明允许使用GET
方法时。您可能已经看到并消化了此处的信息?但是为什么不使用POST方法呢?我为什么要关心这些事件?也许我对流程的理解是错误的。难道这不是一个路由问题,因此可以通过固定路由来解决吗?“可靠的消息来源”实际上不是我的。它是自动添加的,而我正在寻找答案。嘿,关于“官方文件”没有冒犯。我只是找不到更好的链接标题。我在答案中添加了POST
内容。你可能不应该关心机器人,但不是所有的机器人都一样笨。我宁愿保留日志以防万一。路线没有问题。这正是它的实现方式,但是如果你想把它指向其他地方,你可以显式地覆盖GET/acme/login\u check
。啊哈,对于像我这样的傻瓜来说,这真的很有帮助。所以,对我来说,这是routig的问题,因为没有防火墙介入。假设/login\u检查没有健全的GET场景,您不能提出解决方案吗?当通过GET请求/login\u检查时,您将使用403或404(因为这里500肯定是错误的)?如果可能的话,甚至405我已经更新了答案如何返回自定义响应代码。谢谢!最后一个问题。如果覆盖checkAction,我如何判断它是按照最初的预期运行的(POST请求,但没有防火墙条目),还是因为我的案例(GET请求)而运行的?