SymfonyのGuard認証を完全ガイド!初心者でもわかるカスタム認証の仕組みと使い方
生徒
「Symfonyで自分だけのログイン方法を作りたいんですが、どうすればいいんですか?」
先生
「そんな時に使えるのがGuard認証です。ログイン処理を細かくカスタマイズしたい時にとても便利ですよ。」
生徒
「ログイン処理をカスタマイズ?何だか難しそうですが、どういう仕組みなんですか?」
先生
「Guardは“認証を担当する専用スタッフ”のようなもので、ユーザーの情報を確認して正しければ中へ通す、という役割を持っています。順番に解説していきますね。」
1. Guard認証とは?初心者向けにやさしく説明
SymfonyのGuard認証は、ログイン処理を自由にカスタマイズできる仕組みです。通常のログイン機能ではSymfonyが決まった手順で認証しますが、Guardを使うと自分で「どのように認証するか」を作り込むことができます。
たとえば、次のような場面でGuardが役立ちます。
- 通常のログインフォームではなく、独自の画面やAPIでログインさせたい
- トークン(キーワードのようなもの)を使って認証したい
- 外部サービスと連携してログインしたい
初心者の方は「Guard=カスタム認証の設計図」とイメージすると理解しやすくなります。
2. Guard認証の流れをイメージしてみよう
Guardが行う認証の流れは、大きく分けて次のステップです。
- supports:このリクエストは認証の対象かどうか判断する
- getCredentials:送信されたユーザー情報を取り出す
- getUser:渡された情報からユーザーを取得する
- checkCredentials:ユーザーのパスワードなどが正しいか確認する
- onAuthenticationSuccess:ログイン成功時の処理
- onAuthenticationFailure:ログイン失敗時の処理
つまり、Guardは「誰が来たのか → 本物かどうか → 中へ案内するかどうか」を順番に判断しているのです。
3. GuardAuthenticator クラスのイメージを理解する
Guard認証を作ると、Symfonyは「GuardAuthenticator」というクラスを用意します。このクラスの中に先ほどの認証処理をまとめて書きます。
class LoginAuthenticator extends AbstractGuardAuthenticator
{
public function supports(Request $request)
{
return $request->getPathInfo() === '/login' && $request->isMethod('POST');
}
}
この例では、/loginへPOSTされたときだけ認証処理を行うように設定しています。Guardは「いつ認証するか」を自分で決められる点が特徴です。
4. ユーザー情報の取り出しと照合の仕組み
supportsで認証対象と判断されたら、次にメールアドレスやパスワードといった情報を取り出します。
public function getCredentials(Request $request)
{
return [
'email' => $request->request->get('email'),
'password' => $request->request->get('password'),
];
}
ここで取得した情報をもとに、getUserメソッドでデータベースからユーザーを検索します。
public function getUser($credentials, UserProviderInterface $userProvider)
{
return $userProvider->loadUserByUsername($credentials['email']);
}
ユーザーが見つかったら、checkCredentialsでパスワードを照合します。SymfonyのPasswordHasherを使って安全に確認します。
5. 認証成功と失敗の処理
ログインが成功した場合は、どのページに案内するかを指定できます。
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
return new RedirectResponse('/dashboard');
}
逆にログイン失敗時には、エラーメッセージを表示したり、ログイン画面へ戻したりできます。
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
return new RedirectResponse('/login');
}
6. Guard認証を使うメリット
Guard認証には次のようなメリットがあります。
- ログイン処理を自由にカスタマイズできる
- API用のトークン認証など柔軟な処理が書ける
- 外部サービスと連携したログイン機能が作れる
- 認証の流れを細かく制御できるため高度な仕組みを作りやすい
つまり「普通のログインでは物足りない」「もっと自由に認証の仕組みを作りたい」という場面にぴったりなのがGuardです。