【问题标题】:Can't Logout user in Symfony4无法在 Symfony4 中注销用户
【发布时间】:2018-06-20 20:43:16
【问题描述】:

我正在将使用 Symfony2.7 构建的项目更新到 Symfony4,一切正常并且具有良好的兼容性,但应该没问题的一件事是,内置资源,即安全层,没有按预期工作.

我面临的问题是我无法再注销用户。我按照guide 上的步骤进行操作,但没有任何改变。

以下是安全配置:

#config/packages/security.yaml
security:
    encoders:
        App\Entity\Clients:
            algorithm: bcrypt

    providers:
        app_user_provider:
            entity:
                class: App\Entity\Clients
    firewalls:    
        app:
            pattern: ^/
            anonymous: ~
            provider: app_user_provider
            remember_me:
                secret: "%kernel.secret%"
            form_login:
                use_referer: true
                login_path: login
                check_path: login_check
                always_use_default_target_path: false
                default_target_path: dashboard
                csrf_token_generator: security.csrf.token_manager
            logout:
                path: logout
                target: home
                invalidate_session: false

我使用的路径是路径名称,但也尝试了路径本身。

我可以正常登录任何用户,但是当我点击注销路由时,我只是被重定向到主路由,但用户仍然经过身份验证。

尝试设置自定义处理程序注销,例如:

logout:
    handlers: [logout_handler]

它引用了实现 Symfony\Component\Security\Http\Logout\LogoutHandlerInterface 的服务,但它甚至没有调用处理程序。

如果我只能使用默认处理程序那就太好了,并且有必要保持“remember_me”行为,这在 2.7 中也可以正常工作。

谁能帮我解决这个问题?

编辑:我的配置 routes.yaml 是空的,因为我使用的是注解路由,所以 config/packages/routing.yaml 如下:

framework:
    router:
        strict_requirements: ~

就像使用 composer create-project 命令初始化时一样。 对于注释配置,我有文件 config/routes/annotations.yaml:

controllers:
    resource: ../../src/Controller/
    type: annotation

同样,它是配方自己创建的配置。

【问题讨论】:

  • 你能显示你的 config/routes.yaml 吗?您在logout 路由的某些控制器中有操作吗?
  • 我对这个问题做了一些补充。是的,我有一个注销动作,因为它是一个路由名称,需要定义它,所以我创建了一个动作,就像它在框架的其他版本中工作一样,但它是空的,只是用一个动作定义路由.

标签: php symfony security logout symfony4


【解决方案1】:

如果您按照Symfony Security Logging Out 的说明进行操作,请确保使用正确的路由名称来访问 /logout。我必须使用“app_logout”才能真正将其注销,并且我无法在不修改控制器注释的情况下更改 Security.yaml 文件中的路径名(见下文)。无需控制器。不需要自定义处理程序(感谢上帝)。

配置注销后,尝试运行 php bin/console debug:router 以检查到 /logout 的实际路由。

我的 Security.yaml 的注销部分如下所示:

logout:
    path: app_logout
    # where to redirect after logout
    target: front

根据说明,我添加了一个空控制器(如果您想要自定义路径名,则必须在此处更改路径名并将更改添加到 Security.yaml):

<?php

//App/Controller/SecurityController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class SecurityController extends AbstractController
{
    /**
     * @Route("/logout", name="app_logout")
     */
    public function logout()
    {
        throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall');
    }
}

我的电话是这样的:

<a class="nav-link" href="{{ path('app_logout') }}">Logout</a>

【讨论】:

    【解决方案2】:

    我通过使用 **LogoutSuccessHandler* (reference) 删除 REMEMBERME cookie 实现了注销的结果。

    我认为这是一个丑陋的解决方法,但结果令人满意,因为一切正常。但仍然不知道为什么它不能自动与配置一起工作,以及为什么我不能使用自定义注销处理程序。如果有人提出更好的答案,我可以将其标记为已接受的答案。

    【讨论】:

      【解决方案3】:

      您需要在控制器中删除注销操作,
      接下来添加路由到config/routes.yaml

      更多信息在这里。
      https://symfony.com/doc/current/security.html#logging-out

      【讨论】:

      • 同样,我创建了另一个项目,尝试使用控制器路由创建表单登录,并且成功了,我想这不是问题。但是使用最少的配置,它不会注销。
      猜你喜欢
      • 1970-01-01
      • 2018-10-31
      • 2016-10-26
      • 1970-01-01
      • 2019-04-24
      • 2016-08-07
      • 1970-01-01
      • 2020-04-18
      • 2013-01-24
      相关资源
      最近更新 更多