🔑
[Symfony <=5.2]強制的にログイン済みにする
Symfony 5.2以前での強制ログインです。5.3以降はこちら
ユーザ登録後などでどうしてもログイン済みにさせたい場合にログイン済みにする方法です。
※認証・認可の設定は省略します。
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を覚えておきます。
ここではmain
とLoginFormAuthenticator
です。
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()
を実行すると指定したユーザを認証したことにしてくれます。
Discussion