21.

ログインユーザー情報の取得

編集
この記事の要点
  • Laravel でログインユーザー情報を取得する 3 つの方法
  • Auth::user(): ファサード使用
  • auth()->user(): ヘルパ関数
  • $request->user(): Request オブジェクトから
  • 未ログイン時は null → 必ず null チェック or auth ミドルウェアで保護

 

基本的な取得方法

use Illuminate\Support\Facades\Auth;

// 方法 1: Auth ファサード
$user = Auth::user();
$userId = Auth::id();

// 方法 2: auth() ヘルパ (推奨、短い)
$user = auth()->user();
$userId = auth()->id();

// 方法 3: Request から
public function show(Request $request) {
    $user = $request->user();
    $userId = $request->user()->id ?? null;
}

// 未ログインの場合
$user = auth()->user();  // → null
if ($user) {
    echo $user->name;
}

ログイン状態の確認

// ログイン中か
if (Auth::check()) { ... }
if (auth()->check()) { ... }

// 未ログインか (ゲストか)
if (Auth::guest()) { ... }
if (auth()->guest()) { ... }

// または
if (! auth()->user()) { ... }

Blade テンプレート


@auth
    

ようこそ、{{ auth()->user()->name }} さん

ログアウト @else ログイン @endauth @guest ログイン @endguest @auth('admin') 管理画面 @endauth @auth
  • 名前: {{ Auth::user()->name }}
  • メール: {{ Auth::user()->email }}
  • ID: {{ Auth::id() }}
@endauth

コントローラでの利用

class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');  // 全メソッドで認証必須
    }

    public function profile()
    {
        $user = auth()->user();
        return view('profile', compact('user'));
    }

    public function update(Request $request)
    {
        $user = $request->user();  // 必ず認証済 (ミドルウェアで保護)
        $user->update($request->validated());
        return redirect()->route('profile')->with('success', '更新しました');
    }
}

// 個別メソッドだけ認証
class PostController extends Controller
{
    public function index() { ... }  // 認証不要

    public function create()
    {
        $this->middleware('auth');
        // ...
    }
}

ミドルウェアでの保護

// routes/web.php
Route::middleware('auth')->group(function () {
    Route::get('/profile', [UserController::class, 'profile']);
    Route::get('/settings', [UserController::class, 'settings']);
});

// 特定ガード
Route::middleware('auth:admin')->group(function () {
    Route::get('/admin', [AdminController::class, 'index']);
});

// ゲストのみ (ログイン済はリダイレクト)
Route::middleware('guest')->group(function () {
    Route::get('/login', [LoginController::class, 'show']);
    Route::get('/register', [RegisterController::class, 'show']);
});

ユーザーのプロパティ・リレーション

// User モデル (app/Models/User.php)
class User extends Authenticatable
{
    protected $fillable = ['name', 'email', 'password'];
    protected $hidden = ['password', 'remember_token'];

    public function posts()
    {
        return $this->hasMany(Post::class);
    }

    public function profile()
    {
        return $this->hasOne(Profile::class);
    }

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

// 利用
$user = auth()->user();
$user->name;
$user->email;
$user->posts;          // 関連投稿
$user->profile->bio;   // プロフィール
$user->roles->pluck('name');  // ロール一覧

// Eager Loading で N+1 回避
$user = auth()->user()->load('posts', 'profile', 'roles');

権限チェック

// Gate / Policy
if (Gate::allows('edit-post', $post)) { ... }
if ($request->user()->can('edit', $post)) { ... }

// Blade
@can('edit', $post)
    編集
@endcan

@cannot('delete', $post)
    削除権限なし
@endcannot

// 役割
if (auth()->user()->hasRole('admin')) { ... }
if (auth()->user()->isAdmin()) { ... }

API での認証 (Sanctum / Passport)

// Sanctum 設定済前提
// routes/api.php
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

// SPA でログイン後
fetch("/sanctum/csrf-cookie", { credentials: "include" });
fetch("/login", { method: "POST", body: ... });
fetch("/api/user", { credentials: "include" })
    .then(r => r.json())
    .then(user => console.log(user));

// API token 認証
$user->createToken('api-token')->plainTextToken;
// ヘッダで Authorization: Bearer xxx

複数ガード対応

// config/auth.php
'guards' => [
    'web' => ['driver' => 'session', 'provider' => 'users'],
    'admin' => ['driver' => 'session', 'provider' => 'admins'],
    'api' => ['driver' => 'sanctum', 'provider' => 'users'],
],

// 特定ガードからユーザー取得
$user = Auth::guard('admin')->user();
$user = auth('api')->user();

// ガード指定でログイン
Auth::guard('admin')->login($admin);

// 両方のガードでチェック
if (Auth::guard('web')->check() || Auth::guard('admin')->check()) { ... }

セッション保存とログイン

// 手動ログイン
$user = User::find(1);
Auth::login($user);

// メール + パスワードで
$credentials = ['email' => '...', 'password' => '...'];
if (Auth::attempt($credentials)) {
    return redirect()->intended('/dashboard');
}

// 「ログイン状態を保持」
Auth::attempt($credentials, $remember = true);

// ログアウト
Auth::logout();
auth()->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();

セキュリティ注意

  • ログイン直後にセッション ID 再生成: $request->session()->regenerate()
  • 機密情報を hidden に: protected $hidden = ['password', ...]
  • 権限チェック必須: $user->can('edit', $post) や Gate / Policy
  • Mass Assignment 対策: $fillable / $guarded 設定
  • CSRF 保護: フォームに @csrf

関連記事

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)