Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何摆脱;您必须配置防火墙要处理的检查路径";GET请求出错?_Php_Symfony_Fosuserbundle - Fatal编程技术网

Php 如何摆脱;您必须配置防火墙要处理的检查路径";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

当我以通常的方式(使用登录表单)进行身份验证时,它可以正常工作。仅当通过GET方法直接访问
/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请求是由防火墙处理的,并且由控制器获取请求。因此,似乎必须扩展default
checkAction()
才能处理两种情况:

  • 当请求为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请求)而运行的?