1. HOME
  2. ブログ
  3. エンジニアリング
  4. Laravelで認可を実装してみよう

BLOG

ブログ

エンジニアリング

Laravelで認可を実装してみよう

チュートリアルの全体像

本チュートリアルを通じて学べる内容は以下のようになります。

  1. Laravelの開発環境セットアップ
  2. Laravel Breezeで認証機能を導入
  3. Laravelのルーティングを徹底解説
  4. Laravelのコントーラーを徹底解説
  5. Laravelのブレイドを使ってみよう
  6. マイグレーションの仕組みを解説
  7. シーディングを使ってみよう
  8. Eloquentの基本と使い方を徹底解説
  9. 画像アップロードを実装する方法
  10. バリデーションを実装してみよう
  11. Laravelで認可処理を実装しよう

動画で学びたい方はこちらから!

解説

認可とは?

認可とは、ある条件を元にリソースに対する特定のアクション権限を許可することです。

ちょっとわかりにくいと思うので、例えば、ブログ投稿システムの例で考えてみましょう。

このように、Aさん、Bさん、そしてAさんが投稿した記事(リソース)があります。
もちろん、Aさんの投稿をAさんが編集したり、削除したりするのは自由ですが、Bさんが勝手に編集したり、削除するのはまずいです。

そこで、編集や削除の権限をアプリケーションで制御する必要があるというわけです。さっそく実装していきましょう!

実践

ポリシー作成

php artisan make:policy PostPolicy --model=Post

app/Policies/PostPolicy.php

上記のファイルが作成されます。

ポリシー定義

<?php

namespace App\Policies;

use App\Models\Post;
use App\Models\User;

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

    /**
     * Determine whether the user can view the model.
     */
    public function view(User $user, Post $post): bool
    {
        return true;
    }

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

    /**
     * Determine whether the user can update the model.
     */
    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }

    /**
     * Determine whether the user can delete the model.
     */
    public function delete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }

    /**
     * Determine whether the user can restore the model.
     */
    public function restore(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }

    /**
     * Determine whether the user can permanently delete the model.
     */
    public function forceDelete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }
}

フォームリクエスト作成

php artisan make:request DestroyPostRequest

フォームリクエストで認可する

投稿編集

app/Http/Requests/UpdatePostRequest.php

<?php

namespace App\Http\Requests;

use App\Models\Post;
use Illuminate\Foundation\Http\FormRequest;

class UpdatePostRequest extends FormRequest
{

    public function authorize(): bool
    {
        $post = Post::find($this->route('post'))->first();
        return $this->user()->can('update', $post);
    }

    // ...省略...
}

投稿削除

app/Http/Requests/DestroyPostRequest.php

<?php

namespace App\Http\Requests;

use App\Models\Post;
use Illuminate\Foundation\Http\FormRequest;

class DestroyPostRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        $post = Post::find($this->route('post'))->first();
        return $this->user()->can('delete', $post);
    }

    // ...省略...
}

フォームリクエストをコントローラに登録

<?php

namespace App\Http\Controllers;

use App\Http\Requests\DestroyPostRequest;
use App\Http\Requests\StorePostRequest;
use App\Http\Requests\UpdatePostRequest;
use App\Models\Post;
use Illuminate\Support\Facades\Storage;

class PostController extends Controller
{

    /**
     * Store a newly created resource in storage.
     */
    public function store(StorePostRequest $request)
    {

    }


    /**
     * Update the specified resource in storage.
     */
    public function update(UpdatePostRequest $request, Post $post)
    {

    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(DestroyPostRequest $request, Post $post)
    {

    }
}
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

関連記事