🔑

[Symfony >=5.3]強制的にログイン済みにする

2021/09/07に公開

Symfony 5.3以降での強制ログインです。5.2以前はこちら

ユーザ登録後などでどうしてもログイン済みにさせたい場合にログイン済みにする方法です。
※認証・認可の設定は省略します。

Step1. security.yamlの設定を確認する

security.yamlに認証・認可設定が書かれていると思います。

config/packages/security.yaml
security:
  ...
  
    firewalls:
        main: # ←ここ
            lazy: true
            provider: app_user_provider
            custom_authenticator:
                - App\Security\LoginFormAuthenticator
            entry_point: App\Security\LoginFormAuthenticator
            logout:
                path: app_logout
  ...

強制的にログインさせたいfirewallの設定名を覚えておきます。
ここではmainです。

Step2. 強制的にログイン済みにするユーザを取得する

ログイン済みにしたいユーザのエンティティを生成・取得します。

src/Controller/SomeController.php

  public function add(Request $request, EntityManagerInterface $entityManager)
  {
    // 例:ユーザ登録処理
    $user = new User();
    $user->setEmail('メールアドレス');
    $user->setPassword('パスワード(暗号化処理割愛)');
    $entityManager->persist($user);
    $entityManager->flush();
  }

Step3. UsernamePasswordTokenを使ってログインする

GuardAuthenticatorHandlerがdeprecatedになったので、別のやり方になります。
UserエンティティとStep1で覚えたfirewall名でUsernamePasswordTokenを作り、AuthenticationManagerInterfaceで認証したトークンを作成。
そのトークンをTokenStorageInterfaceを使ってセットすることでログイン状態にできます。

src/Controller/SomeController.php

-  public function add(Request $request, EntityManagerInterface $entityManager)
+  public function add(
+    Request $request,
+    EntityManagerInterface $entityManager,
+    AuthenticationManagerInterface $authenticationManager,
+    TokenStorageInterface $tokenStorage
  )
  {
    // 例:ユーザ登録処理
    $user = new User();
    $user->setEmail('メールアドレス');
    $user->setPassword('パスワード(暗号化処理割愛)');
    $entityManager->persist($user);
    $entityManager->flush();
    
+    // 強制ログイン
+    $userToken = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
+    $authenticatedToken = $authenticationManager->authenticate($userToken);
+    $tokenStorage->setToken($authenticatedToken);
+    return $this->redirectToRoute('some_page'); // どこかログイン済みのページにリダイレクト
  }

Discussion