🔑
[Symfony >=5.3]強制的にログイン済みにする
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