Symfony 3.1:无法找到路径控制器" / logout"

时间:2016-07-15 10:21:54

标签: php symfony logout

我正在尝试使用Symfony 3.1完成我的注销功能,但到目前为止还没有工作。我正在逐步遵循书籍文档,但我得到的是一个未被发现的例外:

  

无法找到路径" / logout"的控制器。路线是错误的   构造

我确实在security.yml文件中激活了正确的配置参数(logout)

security:
       firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false

            main:
                anonymous: ~
                # activate different ways to authenticate
                form_login:
                    login_path: login
                    check_path: login
            secured_area:
                anonymous: ~
                logout:
                    path:   /logout
                    target: /

我确实在routing.yml中创建了一个路由:

logout:
    path: /logout

根据文档,它不需要控制器,但例外情况表明控制器路径是错误的。

我做错了什么?

5 个答案:

答案 0 :(得分:4)

我认为这是因为您定义了两个防火墙。暂时,摆脱secure_area的东西,尝试类似的东西:

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false

    main:
        pattern:  ^/
        anonymous: ~
        switch_user: true

        form_login:
            provider:            user_provider
            login_path:          user_login
            check_path:          user_login_check
            default_target_path: app_welcome

            username_parameter:  username
            password_parameter:  password

            csrf_parameter:       _csrf_token
            csrf_token_id:        authenticate
            csrf_token_generator: security.csrf.token_manager

        logout:
            path:   user_logout
            target: app_welcome

请注意,注销部分位于主防火墙下。一旦你有主防火墙工作,你可以尝试重新添加secured_area,如果你真的需要它。

是的,我懒得,只是复制/粘贴了一个有效的配置。你必须调整路线以匹配你的路线。

答案 1 :(得分:1)

如果要使用两个防火墙,则可能还需要两个具有两个注销路径的登录表单。

在每个防火墙都能识别的“模式”中添加断开连接的连接路由很重要

路由配置:

# config/routes.yaml
logout_medical:
  path: /logout-medical

logout_patient:
  path: /logout-patient

# I omitted the declaration of the connection routes because they are made with annotations in the controllers

防火墙配置:

# config/packages/security.yaml
security:
  # ...

  firewalls:
    # disables authentication for assets and the profiler, adapt it according to your needs
    dev:
      pattern: ^/(_(profiler|wdt)|css|images|js)/
      security: false

    main:
      pattern: ^/(logout-medical|login-medical|m)
      anonymous: ~
      provider: medical_provider
      form_login:
        login_path: login_medical
        check_path: login_medical
      logout:
        path: logout_medical
        target: login_medical

    patient_area:
      pattern: ^/(logout-patient|login-patient|p)
      anonymous: ~
      provider: patient_provider
      form_login:
        login_path: login_patient
        check_path: login_patient
      logout:
        path: logout_patient
        target: login_patient

答案 2 :(得分:1)

感谢最正确的答案。您还应该知道另一个技巧: 确保/ logout位于防火墙后面。 / logout路径必须匹配防火墙模式。

例如:“模式:^ / admin”,则注销路径应为“ / admin / logout”。

答案 3 :(得分:0)

因为您很可能没有与该路线相关联的控制器。 如果您使用的是像FOSUser这样的软件包,则只​​需要导入该软件包提供的routing.yml。如果您没有任何捆绑/控制器来处理该路由,您必须实施一个。

答案 4 :(得分:0)

为Cerad的答案添加更多细节:Symfony中的安全用户绑定到"安全上下文"默认情况下,它对应于防火墙。在您的情况下,您希望退出已强制执行form_login身份验证要求的上下文("防火墙"),因此需要在" main&#34上设置您的注销配置;防火墙,而不是一个名为" secured_area"。

的新防火墙

文档使用防火墙名称" secured_area"仅作为一种方式,表明此配置旨在用于保护您网站的一部分的防火墙中。它并不打算将该名称直接复制到您的配置中;相反,在您的情况下,您尝试保护的防火墙称为" main"。从这个意义上说,documentation有点令人困惑,因为在其他任何地方它只使用一个名为" main"例如,包括设置安全区域的示例。所以我想如果使用" main"可能会更好。在这个特殊的例子中。

此外,您需要确保注销路径(路径)实际上由您已配置它的防火墙处理,而不是被捕获"由不同的防火墙。在你的情况下,这将自动发生,因为你没有对你的"主要"防火墙,所以它抓住了一切。