ホームページ > バックエンド開発 > PHPチュートリアル > 認可: Laravel のポリシーを理解する

認可: Laravel のポリシーを理解する

Linda Hamilton
リリース: 2024-10-18 22:08:31
オリジナル
435 人が閲覧しました

アプリケーション内でユーザーができること、できないことを制御することは、実際のアプリケーションを構築するときに行う必要がある最も重要なことの 1 つです。

たとえば、todo アプリケーションでは、ユーザーが他のユーザーの todo を編集または削除できないようにする必要があります。

この記事では、シンプルな ToDo アプリケーションを構築することでユーザーが実行できる内容をポリシーを使用して制御することにより、Laravel でこれを行うシームレスな方法の 1 つを学習します。

このチュートリアルを進めるには、Laravel とそのアプリケーション構造の基本を理解している必要があります。

基本アプリケーションの作成

次のコマンドを実行して、目的のフォルダーに新しい Laravel アプリケーションを作成し、そこに移動します。

composer create-project laravel/laravel todo-app && cd todo-app
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、次のコマンドを実行して Laravel Breeze をインストールします。

php artisan breeze:install
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Breeze は、ユーザーが登録、ログイン、ログアウトし、パーソナライズされたダッシュボードを表示できるように、認証を使用して新しいアプリケーションをスキャフォールディングします。

その後、次のコマンドを実行してアプリケーション アセットをコンパイルします。

npm install && npm run dev
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Laravel にはデフォルトでファイルベースの SQLite データベースが付属しているため、次に行う必要があるのは、アプリケーション データベース ファイルを TablePlus などのデータベース ビューアやその他の任意のデータベース ビューアに接続することです。

データベースをビューアに接続した後、次のコマンドを実行して、使用可能なテーブルをデータベースに移行します。

php artisan migrate
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

それが完了したら、次のコマンドを実行して、ブラウザでアプリケーションを表示します。

php artisan serve
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

localhost:8000 に次のように新しい Laravel アプリケーションが表示されるはずです。

Authorization: Understanding Policies in Laravel

これで、登録ページに移動してユーザーを作成し、この時点でアプリケーション全体であるダッシュボードにアクセスできるようになります。

モデルのセットアップ

Laravel のモデルは、データベース テーブルを制御するために使用されます。次のコマンドを使用して、App/Models フォルダーに Todo モデルを作成します。

php artisan make:model Todo
ログイン後にコピー
ログイン後にコピー

次に、新しく作成したファイル内で、Todo クラスを次のコードに置き換えます。

class Todo extends Model
{
    use HasFactory;

    protected $fillable = [
        'title',
        'description',
        'completed',
        'user_id'
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
ログイン後にコピー
ログイン後にコピー

上記のコードにより、ユーザーは $fillable プロパティを使用してフォームを送信できるようになります。また、ユーザーと Todo の関係も定義します。この場合、todo はユーザーに属します。次のコードを App/Models/User.php ファイルに追加して、関係のセットアップを完了しましょう:

    public function todos()
    {
        return $this->hasMany(Todo::class);
    }
ログイン後にコピー
ログイン後にコピー

上記のコードは、User モデルを Todo モデルに接続して、多くの ToDo を含めることができるようにします。

移行のセットアップ

Laravel での移行は、データベーステーブルに何を含めるべきかを指定するために使用されます。次のコマンドを実行して、database/migrations フォルダー内に移行を作成します:

composer create-project laravel/laravel todo-app && cd todo-app
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、新しいファイルの up 関数を次の関数に置き換えます。これにより、id、user_id、title、description、completed、timestamp 列を含む todo テーブルがデータベースに追加されます。

php artisan breeze:install
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、次のコマンドを実行して、todos テーブルをデータベースに追加します。

npm install && npm run dev
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ポリシーの設定

Laravel のポリシーを使用すると、特定のリソース (この場合は todo) に対して誰が何をできるかを定義できます。

次のコマンドを使用して App/Policies フォルダー内に TodoPolicy を生成して、その仕組みを見てみましょう:

php artisan migrate
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

次に、新しく作成した TodoPolicy ファイルで、TodoPolicy クラスを次のコードに置き換えます。

php artisan serve
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

上記のコードは、ユーザーが Todo を作成できるが、自分に属する Todo の表示、更新、削除のみができることを指定しています。

次に、次のセクションでコントローラーを設定しましょう。

コントローラーのセットアップ

Laravel のコントローラーは、特定のリソースに対するアプリの機能を制御します。次のコマンドを実行して、App/Http/Controllers 内に TodoController を生成します:

php artisan make:model Todo
ログイン後にコピー
ログイン後にコピー

新しく作成した TodoController ファイルの先頭に次のコードを追加して、データベース操作用の Todo モデルと承認用の Gate クラスをインポートします。

class Todo extends Model
{
    use HasFactory;

    protected $fillable = [
        'title',
        'description',
        'completed',
        'user_id'
    ];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
ログイン後にコピー
ログイン後にコピー

インデックス方式

index メソッドを、ログインしているすべてのユーザーの todo を取得して返す次のコードに置き換えます。

    public function todos()
    {
        return $this->hasMany(Todo::class);
    }
ログイン後にコピー
ログイン後にコピー

Gate::authorize メソッドは、前のセクションで定義した viewAny ポリシー メソッドを使用してユーザーがログインしていることを検証します。

メソッドの作成

ユーザーが todo を作成できるように、create todo フォームをユーザーに返す前に、ユーザーがサインインしていることを検証する次のコードで create メソッドを置き換えます。

php artisan make:migration create_todos_table
ログイン後にコピー

ストアメソッド

ストア メソッドを次のコードに置き換えます。このコードは、ユーザーが Todo を作成できるかどうかを確認し、リクエストを検証して、ToDo を作成し、ユーザーを Todo リスト ページにリダイレクトします。

   public function up(): void
    {
        Schema::create('todos', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->string('title');
            $table->text('description')->nullable();
            $table->boolean('completed')->default(false);
            $table->timestamps();
        });
    }
ログイン後にコピー

編集方法

編集メソッドを次のコードに置き換えます。このコードは、選択した Todo が入力された ToDo 編集フォームをユーザーに返して編集できるようにする前に、ユーザーがその Todo を編集できることを検証します。

php artisan migrate
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

更新方法

更新メソッドを次のコードに置き換えます。このコードは、ユーザーが Todo を更新できるかどうかを確認し、リクエストを検証し、選択した Todo を更新して、ユーザーを Todo リスト ページにリダイレクトします。

php artisan make:policy TodoPolicy --model=Todo
ログイン後にコピー

デストロイメソッド

destroy メソッドを次のコードに置き換えます。このコードは、ユーザーが Todo を削除できるかどうかを確認し、削除して、ユーザーを Todo リスト ページにリダイレクトします。

class TodoPolicy
{
    /**
     * Determine if the user can view any todos.
     */
    public function viewAny(User $user): bool
    {
        return true;
    }

    /**
     * Determine if the user can view the todo.
     */
    public function view(User $user, Todo $todo): bool
    {
        return $user->id === $todo->user_id;
    }

    /**
     * Determine if the user can create todos.
     */
    public function create(User $user): bool
    {
        return true;
    }

    /**
     * Determine if the user can update the todo.
     */
    public function update(User $user, Todo $todo): bool
    {
        return $user->id === $todo->user_id;
    }

    /**
     * Determine if the user can delete the todo.
     */
    public function delete(User $user, Todo $todo): bool
    {
        return $user->id === $todo->user_id;
    }
}
ログイン後にコピー

TodoController ファイルは次のようになります:

composer create-project laravel/laravel todo-app && cd todo-app
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ビューのセットアップ

TodoController メソッドがすべて設定されたので、resources/views フォルダー内に新しい todos フォルダーを作成して、アプリケーションのビューを作成できます。その後、新しい todos フォルダーに create.blade.php、edit.blade.php、index.blade.php ファイルを作成します。

インデックスビュー

次のコードをindex.blade.php内に貼り付けます:

php artisan breeze:install
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ビューの作成

次のコードを create.blade.php 内に貼り付けます:

npm install && npm run dev
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ビューの編集

次のコードを edit.blade.php 内に貼り付けます:

php artisan migrate
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ルートのセットアップ

TodoController のルートの処理は、Laravel のリソース メソッドを使用することで比較的簡単です。これを行うには、次のように、routes/web.php フォルダーの末尾に次のコードを追加します。

php artisan serve
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

上記のコードは、認証ミドルウェアを使用して todos リソースを保護します。ログイン後、アプリケーションで次のルートにアクセスできるようになります:

  • /todos: すべてのユーザーの todo をリストします
  • /todos/create: todos を作成するためのフォームを表示します
  • /todos/edit/1: 指定された ID の todo を編集するためのフォームを表示します。この場合は 1 です。

Todo を作成、編集、削除できるようになりました。ただし、編集と削除の場合は、ログイン ユーザーおよび選択した Todo の所有者としてのみ実行できます。

結論

それで終わりです!ユーザーが自分の Todo のみを作成、表示、編集、削除できる、現実的な Todo アプリケーションが作成されました。修正、提案、質問がありましたら、コメント欄でお知らせください。

最後に、Dev、LinkedIn、Twitter で私をフォローしてください。読んでいただきありがとうございました。また次回でお会いしましょう!

以上が認可: Laravel のポリシーを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート