【问题标题】:Symfony 6.0 - Force logout user in controllerSymfony 6.0 - 在控制器中强制注销用户
【发布时间】:2022-08-08 17:48:13
【问题描述】:

如何强制注销用户从新 Symfony 6 的控制中登录? (版本 6.0.1)

I tried $tokenStorage->setToken($token); but setToken() need 2 args:

(public function setToken(string $tokenId, string $token);)

我试过$request->getSession()->invalidate();,但我的用户总是被登录...

我想注销用户并重定向到另一条路线(à不希望重定向到注销路线)

谢谢

  • 通常你可以做$tokenStorage->setToken(null); 不确定这对于 Symfony 6 是否已经改变。$id = $tokenStorage->getToken()->getId(); 怎么样然后你可以...->setToken($id, null);
  • Symfony 6 中的 TokenStorageInterface 似乎不需要 2 个参数。 $tokenStorage->setToken(null) 对我来说效果很好。
  • 我没有方便的 6.0 示例,但基本上您需要调度 LogoutEvent,然后将令牌设置为 null。看一下Symfony\\Component\\Security\\Http\\Firewall\\LogoutListener::authenticate的源码,基本复制了相关代码。我知道曾经有人谈论将此功能封装到官方注销服务中,但我认为这甚至没有发生。即使没有它,事情似乎也能正常工作,你发送事件也很重要。没有它,您很容易遇到难以调试的问题。

标签: symfony logout symfony6


【解决方案1】:

只需重定向到注销路线:

return $this->redirect($this->generateUrl('YourLogoutRouteName'));

【讨论】:

  • 我不想重定向到注销根目录,因为 à 需要注销用户并重定向到另一个根目录
  • 然后可能是注销事件的事件侦听器。 symfony.com/blog/… 但不确定您是否可以从那里重定向。
【解决方案2】:

好吧,我的错,我用了一个糟糕的课程。

使用Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface 我可以设置$tokenStorage->set(null);

我发现一些工作正常:

<?php

namespace App\Service;

use Symfony\Component\Security\Http\Event\LogoutEvent;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

class SecurityService
{

    public function forceLogout(
        Request $request,
        EventDispatcherInterface $eventDispatcher,
        TokenStorageInterface $tokenStorage) : void
    {
        $logoutEvent = new LogoutEvent($request, $tokenStorage->getToken());
        $eventDispatcher->dispatch($logoutEvent);
        $tokenStorage->setToken(null);
    }
}

谢谢

【讨论】:

  • 好的,这不起作用,因为当我回到家时,我已经登录了……出了点问题:(
【解决方案3】:

所以没有人知道如何帮助我?

我不能使用 /logout 因为我在控制器中,有时我必须确保没有用户登录,因为当我进入这条路线时我会进行治疗。

我需要这个:

当我去 /validate 路线时:

  • 如果用户:已登录 => 注销
  • 为我的用户、其他用户更改一些内容并将一些日志刷新到 bdd
  • 重定向到登录页面以强制用户重新登录

我的服务:

<?php

namespace App\Service;

use Symfony\Component\Security\Http\Event\LogoutEvent;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

class SecurityService
{

    public function forceLogout(
        Request $request,
        EventDispatcherInterface $eventDispatcher,
        TokenStorageInterface $tokenStorage) : void
    {
        $logoutEvent = new LogoutEvent($request, $tokenStorage->getToken());
        $eventDispatcher->dispatch($logoutEvent);
        $tokenStorage->setToken(null);
    }
}

这不起作用,我的 $eventDispatcher->dispacth($logoutEvent) 仅在我刷新页面之前工作,在我再次登录之后!

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2012-05-11
    相关资源
    最近更新 更多