Laravel の認証システムでは、ユーザーをログイン状態にするために主に 2 つのメソッドが用意されています。この記事では、Auth::attempt() と
Auth::login()` の違いと使い分けについて解説します。
Auth::attempt() とは?
Auth::attempt()
は、ユーザーから送信された認証情報(例:メールアドレスとパスワード)を元に、データベース上のユーザー情報を検証し、認証が成功した場合にそのユーザーをログイン状態にします。
主な特徴
-
資格情報の検証:
ユーザーが入力した情報(通常はemail
やpassword
)と、データベース上のレコードとを比較して検証を行います。
※ パスワードは、ハッシュ化された値と比較されます。 -
認証処理とセッションへの保存:
検証が成功すると、ユーザーの主キーがセッションに保存され、以降のリクエストで認証済みユーザーとして扱われます。 -
リメンバーミー機能:
第二引数にtrue
を渡すことで、「Remember Me」機能を有効にすることができます。
使用例
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials, $remember = true)) {
// 認証成功 → ユーザーはログイン状態になり、セッションに保存される
return redirect()->intended('dashboard');
} else {
// 認証失敗
return back()->withErrors([
'email' => '認証に失敗しました。',
]);
}
Auth::login() とは?
Auth::login()
は、既に取得済みのユーザー(User モデルインスタンス)を直接ログイン状態にするメソッドです。
すなわち、認証情報の検証処理は行わず、与えられたユーザーをそのままセッションに保存します。
主な特徴
-
直接ログイン:
すでにユーザー情報がわかっている場合(例:ソーシャルログインや管理者による強制ログインなど)、検証処理を飛ばして即座にログインさせることができます。 -
検証処理がない:
ユーザーが入力した資格情報とデータベース上の情報の一致確認は行われません。
そのため、事前にユーザー情報の正当性が確認されていることが前提です。
使用例
// 例: ID が 1 のユーザーを直接ログインさせる
$user = User::find(1);
Auth::login($user);
// これでユーザーは認証状態になり、セッションにユーザーIDが保存される
return redirect()->route('dashboard');
使い分けのポイント
-
認証情報の検証が必要な場合:
ログインフォームなど、ユーザーからの入力を受け付ける処理ではAuth::attempt()
を利用します。
→ ユーザーが入力した資格情報を基に、正しいパスワードかどうかなどをチェックする必要があるため。 -
既にユーザー情報が確定している場合:
ソーシャルログインや、パスワード認証以外の方法でユーザーを特定できた場合は、Auth::login()
を使用します。
→ たとえば、OAuth認証後のコールバック処理などでユーザー情報を取得済みの場合に、こちらのメソッドを使います。
まとめ
-
Auth::attempt()
→ ユーザーから送信された資格情報を検証し、認証成功時にユーザーをログイン状態にする
→ パスワードハッシュの検証などが内部で行われる -
Auth::login()
→ すでに取得済みのユーザー(Userモデル)を直接ログイン状態にする
→ 資格情報の検証は行われないため、前提として正当性が保証されている場合に使用
このように、状況に応じて使い分けることで、より柔軟な認証処理が実現できます。ぜひ自分のプロジェクトで適切な方法を選択してください。
参考リンク
以上、attempt()
と login()
の違いについての解説でした。質問やご意見があればコメントお待ちしております!