如何摆脱“你必须配置由防火墙处理的检查路径”错误与GET请求?

时间:2015-11-18 09:53:59

标签: php symfony fosuserbundle

当我通过常规方式验证时(使用登录表单),它可以正常工作。我只有在通过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()才能处理两种情况:

  1. 当请求是POST但没有firewal条目存在(已经被nandled)
  2. 当防火墙入口存在但请求是GET(我的情况)

1 个答案:

答案 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的原因。允许使用方法。