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

2 min read読了の目安(約1800字

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

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

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

config/packages/security.yaml
security:
  ...
  
    firewalls:
        main: # ←ここ
            anonymous: true
            lazy: true
            provider: app_user_provider
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator # ←ここ
  ...

強制的にログインさせたいfirewallの設定名と利用しているAuthenticatorを覚えておきます。
ここではmainLoginFormAuthenticatorです。

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. GuardAuthenticatorHandlerとAuthenticatorを使ってログインする

GuardAuthenticatorHandlerとStep1で覚えたfirewall名、Authenticatorを使って認証させます。

src/Controller/SomeController.php

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

GuardAuthenticatorHandler::authenticateUserAndHandleSuccess()を実行すると指定したユーザを認証したことにしてくれます。