0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Laravel/Auth】Auth::attempt()とAuth::login() の違い

Last updated at Posted at 2025-02-06

Laravel の認証システムでは、ユーザーをログイン状態にするために主に 2 つのメソッドが用意されています。この記事では、Auth::attempt() と Auth::login()` の違いと使い分けについて解説します。

Auth::attempt() とは?

Auth::attempt() は、ユーザーから送信された認証情報(例:メールアドレスとパスワード)を元に、データベース上のユーザー情報を検証し、認証が成功した場合にそのユーザーをログイン状態にします。

主な特徴

  • 資格情報の検証:
    ユーザーが入力した情報(通常は emailpassword)と、データベース上のレコードとを比較して検証を行います。
    ※ パスワードは、ハッシュ化された値と比較されます。

  • 認証処理とセッションへの保存:
    検証が成功すると、ユーザーの主キーがセッションに保存され、以降のリクエストで認証済みユーザーとして扱われます。

  • リメンバーミー機能:
    第二引数に 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() の違いについての解説でした。質問やご意見があればコメントお待ちしております!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?