認証と認可(ゲート編)

認証とは

認証とはユーザーやシステムが「誰であるか」を確認するプロセスです。認証は不正アクセス防止、ユーザー固有のデータや機能へのアクセス制御、セキュリティとプライバシーの保護の観点から重要です。認証はユーザーがIDとパスワードを使って自分が何者であるかを証明します。LaravelではBreezeにあらかじめ、ログイン、ログアウト、会員登録、パスワード変更といった認証に必要なシステムが備わっています。

Laravelでの認証

Laravelでは、Laravel Breezeをインストールした場合、最初から認証機能を有しています。認証機能を利用するには初めに、http://localhost/registerでユーザーを新規登録します。次に、http://localhost/loginでログインします。ログインすると、http://localhost/dashboardにリダイレクトされ、ダッシュボードが表示されます。ダッシュボードではログアウトとプロフィール変更ができます。プロフィール変更では、名前やメールアドレス、パスワードの変更、ユーザーの削除などが行えます。

認可とは

認可とは認証後のユーザーがどのリソースや機能にアクセスできるかを決定するものです。認可はアプリケーションのセキュリティを向上させる点で重要です。Laravelではゲートやポリシー、ミドルウェアを使って実装できます。以前、ミドルウェアのカスタムでミドルウェアを用いて管理者以外アクセスできないようにする認可は解説したのでここでは、ゲートとポリシーを使用した認可のシステム構築について解説します。今回はゲートでの認可を解説します。

ゲートでの認可

ゲートとは

ゲートとは特定のアクションをユーザーが実行できるかどうか制御する機能です。主にモデルに依存しない認可ロジックの実装に利用します。

認可の実装

ゲートの実装はAuthServiceProvider.phpに記述します。デフォルトでは存在しないファイルなので、以下のコマンドでファイルを生成します。

php artisan make:provider AuthServiceProvider

上記のコマンドを実行すると、app/Provides/AuthServiceProvider.phpが生成されます。このファイルを以下のように書き換えてゲートを追加します。ゲートはbootメソッドの中に記述します。

<?php

namespace App\Providers;

use App\Models\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap services.
     */
    public function boot(): void
    {
        Gate::define("admin", function (User $user) {
            return $user->is_admin;
        });
    }
}

Gate::defineメソッドでゲートを定義します。一つ目の引数はゲートの名前で二つ目の引数はコールバック関数です。コールバック関数にゲートで認可したい処理を書きます。ここでは取得したUserのis_adminという管理者かどうかを識別するフラグを返しています。is_adminがtrueの場合、そのユーザーは管理者であるため認可され、falseの場合は認可されません。

次に認可のテスト用のコントローラーを作成します。以下のように記述することで認可を実装できます。

    public function index() {
        if (Gate::allows("admin")) {
            return view("gate-auth");
        }
        if (Gate::denies("admin")) {
            return redirect("/");
        }
    }

Gate::allowsは指定されたゲートによって認可されたときにtrueになります。Gate;;deniesは指定されたゲートによって認可されなかったときにtrueになります。上記のコードでは、管理者であれば管理者用のビューを表示し、管理者でなければホームにリダイレクトします。

次に、ビューとルーティングを設定します。ビューは適当なものでよく、ルーティングは通常の設定で問題ないので解説を割愛します。

管理者権限を付与していないユーザーでログインし、指定したURLにアクセスします。ホームにリダイレクトされれば成功です。次に管理者権限を付与したユーザーでログインし、指定したURLにアクセスします。指定したビューが表示されれば成功です。

また、Bladeテンプレートでゲートの認可の有無に合わせて表示する内容を変更することも可能です。@can、@cannotを使用します。

    @can('admin')
        <h1>Admin User</h1>
    @endcan
    @cannot('admin')
        <h1>General User</h1>
    @endcannot

@canでは認可された場合表示し、@cannotでは認可されてない場合に表示します。

今回はゲートによる認可を実装しました。ゲートによる認可はモデルに関係せずに実装することが可能です。一方でモデルに対応させたい場合は記述が複雑になり不適切です。次回はモデルに関連して使用しやすいポリシーについて解説します。

前:

次:

コメントを残す

CAPTCHA