在没有默认控制器/操作的情况下,登录检查路径路由是如何工作的?

30

我正在开发一个Symfony 2.3项目,其中包含以下路由代码

just2_frontend_logincheck:
    pattern:   /login_check

它没有

defaults:{ _controller: testBundle:User:login }

但是它正在工作。但我不知道路由是如何工作的。这可能吗?请就路由向我提出建议。

1个回答

52

check_path 路由/路径被您的防火墙用于捕获登录请求。

这个路由的操作实际上永远不会被访问。这是您的登录表单提交的路由/ URL,并且请求应该由您的防火墙提供程序服务处理。

如果正在执行 check_path 路由的操作,则防火墙出现问题(请求未由防火墙处理)。

如您所见,FOSUserBundle 的 check_path 路由到 SecurityController::checkAction 并仅抛出一个 RuntimeException

check_path 的配置可以在 app/config/security.yml 中找到,在 security.firewalls.<firewallname>.form_login.check_path 下。

它可以是像/login_check这样的模式,也可以是您的情况下的路由名称,即 just2_frontend_logincheck,但没有相关的操作。

security:
    providers:
         your_provider_name: your_provider_service  # authentication provider
         # ...

    firewalls:                                 # Required
        your_firewall_name:
            # ...

            provider: your_provider_name
            form_login:              
                check_path: /login_check       # submit the login form here
                                               # in your case a route name:
                                               # just2_frontend_logincheck

在幕后,Symfony会调用服务your_provider_serviceauthenticate()方法来检查提供的凭据。

您可以使用以下方法找到用作提供程序服务的类:

app/console debug:container --show-private your_provider_service 

如果防火墙没有处理路由,从哪里开始调试? - hchr
1
@hchr - 开始测试check_path路径是否存在,可以通过调试路由器来进行,类似这样:app/console debug:router | grep -i <route_name_or_path>。然后在security.firewalls下注释/禁用除一个外的所有防火墙,并将该单个防火墙的配置精简到最小程度。我的答案显示了一个足以捕获/login_check请求的最小示例。 - Nicolai Fröhlich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接