Laravel - 認可: 初級者向けガイド

こんにちは、将来のLaravel開発者さんたち!今日は、Laravelの認可の世界に飛び込みます。プログラミングが初めてであっても心配しないでください。この旅の親切なガイドとして、ステップバイステップですべてを説明します。始めましょう!

Laravel - Authorization

基本を理解する:認証 vs 認可

Laravelの認可機能に飛び込む前に、一般的な混乱を解消しましょう。

認証: 君は誰?

認証はクラブのボーイを思い浮かべてください。君が誰かを証明するものです。デジタルの世界では、通常はユーザー名とパスワードでログインすることを意味します。

認可: 君は何を許可されている?

そして、認可はVIPリストのようです。クラブにいる(認証されている)場合、認可がどのエリアにアクセスできるかを決定します。VIPルームに行けるか?DJブースの後ろに行くことが許可されているか?

Laravelではまずユーザーを認証し、その後、アプリケーション内での行動を制御するために認可を使用します。

Laravelにおける認可メカニズム

Laravelは強力で柔軟な認可システムを提供しています。それを消化しやすいチャンクに分けてみましょう。

1. ゲート

ゲートはアクションを認可するためのシンプルでクロージャベースの方法です。アプリケーションのチェックポイントと考えます。

ゲートを定義する方法は以下の通りです:

Gate::define('edit-post', function ($user, $post) {
return $user->id === $post->user_id;
});

このゲートはユーザーがポストを編集できるかをチェックします。ユーザーのIDがポストの作者のIDに一致する場合にtrueを返します。

コントローラーでこのゲートを使用する方法:

if (Gate::allows('edit-post', $post)) {
// ユーザーはポストを編集できます...
}

またはBladeテンプレート内で:

@can('edit-post', $post)
<!-- 編集ボタンを表示 -->
@endcan

2. ポリシー

ポリシーは特定のモデルやリソース حولして認可ロジックを整理するクラスです。各モデルの特別なセキュリティガードのように考えます。

まず、Postモデルのためのポリシーを作成します:

php artisan make:policy PostPolicy --model=Post

このコマンドはPostPolicyクラスを作成します。それにメソッドを追加します:

public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}

コントローラーでこのポリシーを使用する方法:

$this->authorize('update', $post);

またはBladeテンプレート内で:

@can('update', $post)
<!-- 更新ボタンを表示 -->
@endcan

3. ロールと権限

Laravelはビルトインのロールシステムを提供していませんが、簡単に実装できます。以下はシンプルな例です。

まず、usersテーブルに'role'カラムを追加します:

Schema::table('users', function (Blueprint $table) {
$table->string('role')->default('user');
});

次に、管理者権限をチェックするゲートを作成します:

Gate::define('admin', function ($user) {
return $user->role === 'admin';
});

コントローラーやビューで使用する方法:

if (Gate::allows('admin')) {
// ユーザーは管理者です...
}
@can('admin')
<!-- 管理者パネルのリンクを表示 -->
@endcan

4. メッセージ

Laravelでは、ルートレベルでアクセスを制御するためにミドルウェアを使用することもできます。まずカスタムミドルウェアを作成します:

php artisan make:middleware CheckRole

このミドルウェアのhandleメソッド内:

public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
abort(403, 'Unauthorized action.');
}

return $next($request);
}

このミドルウェアをapp/Http/Kernel.phpで登録します:

protected $routeMiddleware = [
// ...
'role' => \App\Http\Middleware\CheckRole::class,
];

ルートで使用する方法:

Route::get('/admin', function () {
//
})->middleware('role:admin');

メソッド表

以下は、今回カバーした主なメソッドの表です:

メソッド 説明
Gate::define() 新しい認可ゲートを定義 Gate::define('edit-post', function ($user, $post) { ... })
Gate::allows() ゲートがアクションを許可するかチェック Gate::allows('edit-post', $post)
$this->authorize() コントローラー内でアクションを認可 $this->authorize('update', $post)
@can Bladeディレクティブで認可 @can('update', $post) ... @endcan
Gate::forUser() 特定のユーザーのためのゲートインスタンスを取得 Gate::forUser($user)->allows('edit-post', $post)

認可は、認証されたユーザーがアプリケーション内で何をできるかを制御することです。安全でユーザーフレンドリーなウェブアプリケーションを構築するための重要な部分です。

練習を重ね、より多くのアプリケーションを構築するにつれて、これらの概念に慣れていくでしょう。実験を恐れずに - それが私たちの学びです!

さあ、未来のLaravelエキスパートたち、ハッピーコーディング! ??‍??‍?

Credits: Image by storyset