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

You*_*nse 9 php symfony fosuserbundle

当我通过常规方式验证(使用登录表单)时,它可以正常工作.我只有在/check_form通过GET方法直接访问时才会收到此错误,在这种情况下抛出异常:

您必须使用安全防火墙配置中的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
Run Code Online (Sandbox Code Playgroud)

我使用2.3,因此没有methods适用的选项(虽然我不知道它是否会有所帮助).

这不是一个真正的问题,因为这个错误不能破坏正确的使用方法,但是当一些勤奋的机器人访问该站点时它会污染错误日志并且它只是不整洁.所以,我想知道我可以更改哪个配置选项来摆脱这个错误.

为了降低这一点,似乎我想要抛出一些4xx错误而不是500.理想情况下它应该是405 Method Not Allowed,但404冷却也是如此.

编辑:

正如我从下面的Alex的答案中了解到的那样,这是因为POST请求由防火墙和Controller的GET请求处理.因此,似乎checkAction()必须扩展默认值才能处理两种情况:

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

Ale*_*lex 8

没有配置选项.如果请求到达控制器,它无条件地抛出异常:可靠的来源.

POST对路线的请求由防火墙处理:官方文档 ; GET像往常一样去控制器.

如果您不关心此类事件,则几乎没有选项可以消除日志中的错误.在我看来,最简单的是覆盖SecurityController::checkAction以返回500错误而不抛出异常.官方文档如何实现它:覆盖默认的FOSUserBundle控制器.

编辑:

在控制器中,您可以返回您喜欢的任何代码:

public function checkAction()
{
    return new Response('', 418); // or better use Response constants 
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是/acme/login_check在路由配置中禁用GET方法,让路由器完成其工作并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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我建议调试您的路线.该逻辑应该属于路由器,而不是控制器.从长远来看,您的路由配置会误导将维护此代码的开发人员,并且405app/console debug:router明确指出GET允许该方法时,他们将有几个难以调试的小时试图弄清楚它返回的原因.