簡體   English   中英

Symfony 自定義注銷

[英]Symfony custom logout

我正在嘗試創建一個注銷功能,當從下面(示例)中單擊時,該功能會重定向到必要的頁面。

例子:

  1. 如果有人點擊以 aaa.io/user 開頭的網站注銷 -> go 到 aaa.io/login。
  2. 如果有人點擊以 aaa.io/dev/{id} 開頭的網站注銷 -> go 到 aaa.io/home/{id}

如何創建兩個將重定向到兩個單獨頁面的注銷功能? 我試過第一個例子並且工作正常。我聽說我們可以使用 Symfony 防火牆來做到這一點,但無法獲得它。

#security.yaml
security:
    enable_authenticator_manager: true
    # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
    password_hashers:
        Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
        App\Entity\Dimitry:
            algorithm: auto

    providers:
        app_user_provider:
            entity:
                class: App\Entity\Dimitry
                property: email
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            lazy: true
            provider: app_user_provider
            custom_authenticator: App\Security\LoginAuthenticator
            logout:
                path: app_logout
                target: app_login

//Security Controller
#[Route(path: '/login', name: 'app_login')]
    public function login(AuthenticationUtils $authenticationUtils): Response
    {
         if ($this->getUser()) {
             return $this->redirectToRoute('app_home');
         }

        // get the login error if there is one
        $error = $authenticationUtils->getLastAuthenticationError();
        // last username entered by the user
        $lastUsername = $authenticationUtils->getLastUsername();

        return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
    }

    #[Route(path: '/logout', name: 'app_logout')]
    public function logout()
    {
        return $this->redirectToRoute('app_login');

        //throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
    }

注銷方法永遠不會被調用,因為它被防火牆上的注銷鍵攔截了。 因此 public function logout 中的代碼行不會被執行。

IMO,你可以使用事件:

  1. 創建訂閱者,
  2. 訂閱LogoutEvent::class ,
  3. 分析注銷事件提供的請求
  4. 用它來確定路線,
  5. 捕獲注銷事件提供的響應,
  6. 使用 UrlGenerator 重定向用戶,
  7. 更新響應以重定向到相應的路由

文檔提供了一個很好的示例,您可以將其用作您的邏輯模板。 您的訂閱者可能是這樣的:

// src/EventListener/LogoutSubscriber.php
namespace App\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;

class LogoutSubscriber implements EventSubscriberInterface
{
    public function __construct(
        private UrlGeneratorInterface $urlGenerator
    ) {
    }

    public static function getSubscribedEvents(): array
    {
        //2 - Subscribe to LogoutEvent
        return [LogoutEvent::class => 'onLogout'];
    }

    public function onLogout(LogoutEvent $event): void
    {
        // get the security token of the session that is about to be logged out
        $token = $event->getToken();

        // 3. get the current request
        $request = $event->getRequest();

        // 4. Your own logic to analyze the URL
        $route = 'homepage';//default route
        if (...) {
            $route = 'URL1';
        }
        if (...) {
            $route = 'URL2';
        }

        // 5. get the current response, if it is already set by another listener
        $response = $event->getResponse();

        // configure a custom logout response to the homepage
        $response = new RedirectResponse(
            $this->urlGenerator->generate($route),
            RedirectResponse::HTTP_SEE_OTHER
        );
        $event->setResponse($response);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM