Contents
Jetstreamのデフォルト認証構造とその設計思想
Laravel Jetstreamは、Laravel 8から導入された公式パッケージであり、チーム管理機能やAPIトークン発行といった高度なセキュリティ要件を内蔵しています。このデフォルト構造を理解することで、カスタム実装時の設計判断が明確になります。
Laravel Jetstreamの認可モデル概要
JetstreamではUserモデルとTeamモデルが連携し、ユーザー単位で権限を管理する仕組みがあります。特にチーム機能は、以下のように構成されています:
| 項目 | 値 | 補足 |
|---|---|---|
| 認証方式 | パスワード + 2FA | 標準で二要素認証がサポート |
| チーム管理 | 多対多関係 | belongsToMany()を介して実装 |
| APIトークン | 認可スコープ付き | 管理者による発行可能 |
この構造は、複数チーム間での権限分離や外部サービスとの連携に最適です。
ポリシークラスによる柔軟な権限制御拡張
JetstreamのGateとPolicyクラスを活用することで、ユーザーのロールごとに認可ロジックをカスタマイズできます。特に「特定ユーザーグループのみに許可」など、プロジェクト固有の条件を組み込む場面が多いため、理解が必要です。
認可ロジックのカスタムポリシー作成手順
php artisan make:policy ExamplePolicyでポリシーファイルを作成- ポリシークラス内で
userCanAccess()など、独自メソッドを定義 Gate::define()でルールを登録し、コントローラーまたはビューで呼び出す
具体例として、管理ユーザーにのみ編集権限を与える場合:
|
1 2 3 4 5 |
// ExamplePolicy.php public function update(User $user, Post $post): bool { return $user->roles()->where('name', 'admin')->exists() || $user->id === $post->user_id; } |
このように、GateとPolicyの組み合わせで複数ロール間での権限優先順位を明確に設定可能です。
チーム管理とAPIトークンのカスタム設定例
Jetstreamのチーム管理機能は、企業向けアプリケーションやプロジェクトベースのサービス構築に最適です。しかし、セキュリティ面での要件が異なる場合、モデルやコントローラーを拡張する必要があります。
チームモデルの拡張ポイント
- チーム権限の階層:
team_ownerとteam_memberなどの役割を追加 - APIトークン発行時のセキュリティ対策:
- 有効期限の自動設定:トークン発行時に関連する日付カラムを自動生成
- 権限スコープの制限:
scopes()メソッドで認可範囲を限定
トークン管理の一例:
|
1 2 3 4 5 6 7 8 9 |
// Token.php protected $casts = [ 'expires_at' => 'datetime', ]; public function scopeValidTokens($query) { return $query->where('expires_at', '>', now()); } |
このように、チームモデルとAPIトークンの両方をカスタマイズすることで、セキュリティ要件に応じた柔軟な権限管理が可能になります。
Livewire/Inertia.js環境での認可処理最適化
SPA構築時やインタラクティブUIでの実装では、フロントエンドとバックエンドの両方で認可チェックを行う必要があります。JetstreamはLivewireおよびInertia.jsとの互換性を確保していますが、具体的な手順を確認しましょう。
リアクトティブなUIとの連携設計
Livewireではmount()やrender()メソッド内でGateの検証を行います。一方でInertia.jsでは、フロントエンド側でのアクセス制限チェックに注意が必要です。
Livewireの場合の実装例:
|
1 2 3 4 |
public function mount(Post $post) { abort_if(Gate::denies('edit-post', $post), 403); } |
Inertia.jsでのフロントエンドチェック例(Vue.js):
|
1 2 3 4 |
if (!store.user.roles.includes('admin')) { router.push('/'); } |
このように両方の環境で認可処理を行うことで、セキュリティを強化できます。
二要素認証とカスタムロールの連携設計
高度なセキュリティ要件を持つプロジェクトでは、認証方法とユーザーロールを組み合わせた複合的な権限管理が必要です。Jetstreamには2FA(二要素認証)機能が標準で搭載されています。
2FA導入時のユーザーロール判定フロー
- ステップ1:ログイン時に2FA有無の確認
- ステップ2:管理者ロールの場合、コード送信処理を強化
- ステップ3:セキュリティレベル別にアクセス制限を追加
例:管理者ロールに限定した2FA認証処理
|
1 2 3 4 5 6 7 |
// LoginController.php protected function authenticated(Request $request, $user) { if ($user->hasRole('admin') && !Auth::user()->two_factor_confirmed_at) { return redirect('/2fa'); } } |
このようにロールと認証方法を組み合わせることで、セキュリティレベルに応じたアクセス制限が可能です。
要点まとめ
- Jetstreamのデフォルト構造を理解し、必要に応じてチーム管理やAPIトークンをカスタマイズ
- GateとPolicyクラスで複雑な権限ロジックを実装
- Livewire/Inertia.js環境では、両方での認可処理が必須
- 2FAとユーザーロールの連携によりセキュリティ強化
Jetstreamを活用した柔軟な認可設計は、プロジェクトのセキュリティと使いやすさをバランスよく向上させます。自社のニーズに合った実装方法を探してみてください。