Laravelでパーミッションの自動割り当てとリサイクルを実装する方法

WBOY
リリース: 2023-11-04 11:03:29
オリジナル
755 人が閲覧しました

Laravelでパーミッションの自動割り当てとリサイクルを実装する方法

Laravel は、権限管理などの一般的な問題を実装するための便利なツールを提供する、広く使用されている PHP フレームワークです。多くのアプリケーションでは、ユーザーがアクセスする必要があるものだけにアクセスできるようにするために、ユーザーの権限をきめ細かく制御する必要があります。この記事では、Laravel で権限を自動的に割り当てたり取り消したりする方法について説明します。同時に、具体的なコード例も紹介します。

1. Laravel でポリモーフィック アソシエーションを使用して、パーミッションの自動割り当てとリサイクルを実現します。

Laravel の Eloquent ORM は、ポリモーフィック アソシエーションの機能を提供します。つまり、同じモデルに関連付けられた複数の異なるモデルを組み合わせることができます。データのセット。これは、アクセス許可の自動割り当てとリサイクルに非常に役立ちます。

たとえば、アプリケーション内の「記事」と「コメント」に対するアクセス許可を制御し、ユーザーにロールを割り当てる必要があるとします。次の 4 つのモデルを作成できます。

  • User (ユーザー)
  • Article (記事)
  • Comment (コメント)
  • Role (ロール) ) )

次に、多態性関連付け関数を使用して、3 つのモデルをロールに関連付けます。

class User extends Model
{
    public function roles()
    {
        return $this->morphToMany(Role::class, 'model', 'model_has_roles');
    }
}

class Article extends Model
{
    public function roles()
    {
        return $this->morphToMany(Role::class, 'model', 'model_has_roles');
    }
}

class Comment extends Model
{
    public function roles()
    {
        return $this->morphToMany(Role::class, 'model', 'model_has_roles');
    }
}
ログイン後にコピー

この例では、Laravel の多態性関連付け関数を使用するため、ロールを定義できます。 3 つのモデルの関係とその記録。次のステップは、これらの関係を保持する中間テーブルを作成することです。

class CreateModelHasRolesTable extends Migration
{
    public function up()
    {
        Schema::create('model_has_roles', function (Blueprint $table) {
            $table->unsignedBigInteger('role_id');
            $table->unsignedBigInteger('model_id');
            $table->string('model_type');
            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
            $table->primary(['role_id', 'model_id', 'model_type']);
        });
    }
}
ログイン後にコピー

これで、上記のモデルを対応するロールに関連付けることができます。たとえば、投稿の作成者に「作成者」の役割を割り当てたと仮定すると、次のようになります:

$article->roles()->syncWithoutDetaching([
    Role::where('name', 'author')->first()->id
]);
ログイン後にコピー

同様に、新しいコメントを作成し、そのコメントの作成者に「コメント作成者」の役割を割り当てます。これは次のように実装できます。

$comment = new Comment();
$comment->content = 'This is a new comment.';
$comment->user_id = Auth::user()->id;
$comment->save();
$comment->roles()->syncWithoutDetaching([
    Role::where('name', 'commenter')->first()->id
]);
ログイン後にコピー

このようなコードを使用すると、ロールを使用して誰がどのアクションを実行できるかを制御できます。ここで、新しいユーザーとその投稿やコメントに適切なロールを自動的に割り当て、それらのレコードが削除されたときにロールの割り当てを自動的に削除する方法が必要です。

2. Laravel でイベント リスナーを使用して、パーミッションの自動割り当てとリサイクルを実現します。

パーミッションの自動割り当てとリサイクルを実現するために、Laravel イベント システムのイベント リスナーを使用して、興味のある感情の出来事。イベントリスナーとは、アプリケーション固有のイベント応答関数を登録する機構であり、この機構によりアプリケーション内のさまざまなイベントに非常に柔軟に応答することができます。

たとえば、Laravel には、ユーザーの作成時および削除時に自動的にトリガーされる UserCreating イベントと UserDeleting イベントが用意されています。イベント リスナーを作成して、ユーザーの作成時に必要なロール関係を作成し、削除時にこの関係を削除できます。

まず、新しいイベント リスナーを定義する必要があります。

class UserEventListener
{
    public function onUserCreating(UserCreating $event)
    {
        $user = $event->user;
        $roles = Role::where('name', 'user')->get();

        foreach ($roles as $role) {
            $user->roles()->create([
                'role_id' => $role->id,
            ]);
        }
    }

    public function onUserDeleting(UserDeleting $event)
    {
        $user = $event->user;
        $user->roles()->detach();
    }
}
ログイン後にコピー

このイベント リスナーは 2 つのメソッドを定義します。 1 つのメソッド (onUserCreating) は、ユーザーの作成時に自動的にトリガーされ、ユーザーに「ユーザー」ロールを割り当てます。ユーザーがそのロールに関連するすべてのレコードを削除すると、別のメソッド (onUserDeleting) が自動的に起動します。

次に、これらのイベント リスナーをアプリケーション サービス プロバイダーに登録する必要があります。

class AppServiceProvider extends ServiceProvider
{
    protected $listen = [
        UserCreating::class => [
            UserEventListener::class,
        ],

        UserDeleting::class => [
            UserEventListener::class,
        ],
    ];

    public function boot()
    {
        //
    }
}
ログイン後にコピー

これで、ユーザーを作成または削除すると、適切なアクションが自動的に実行されます。ロールをインストールする最後のステップは、投稿とコメントに対して同様のイベント リスナーを定義することです。

class ArticleEventListener
{
    public function onArticleCreating(ArticleCreating $event)
    {
        $article = $event->article;
        $roles = Role::where('name', 'author')->get();

        foreach ($roles as $role) {
            $article->roles()->create([
                'role_id' => $role->id,
            ]);
        }
    }

    public function onArticleDeleting(ArticleDeleting $event)
    {
        $article = $event->article;
        $article->roles()->detach();
    }
}

class CommentEventListener
{
    public function onCommentCreating(CommentCreating $event)
    {
        $comment = $event->comment;
        $roles = Role::where('name', 'commenter')->get();

        foreach ($roles as $role) {
            $comment->roles()->create([
                'role_id' => $role->id,
            ]);
        }
    }

    public function onCommentDeleting(CommentDeleting $event)
    {
        $comment = $event->comment;
        $comment->roles()->detach();
    }
}
ログイン後にコピー

これらのリスナーをサービス プロバイダーの対応するイベントとして登録する必要もあります。

class AppServiceProvider extends ServiceProvider
{
    protected $listen = [
        UserCreating::class => [
            UserEventListener::class,
        ],

        UserDeleting::class => [
            UserEventListener::class,
        ],

        ArticleCreating::class => [
            ArticleEventListener::class,
        ],

        ArticleDeleting::class => [
            ArticleEventListener::class,
        ],

        CommentCreating::class => [
            CommentEventListener::class,
        ],

        CommentDeleting::class => [
            CommentEventListener::class,
        ],
    ];

    public function boot()
    {
        //
    }
}
ログイン後にコピー

これで、アクセス許可の自動割り当てとリサイクルを実装するためのすべての手順が完了しました。この後、ユーザー、記事、コメントを作成すると、対応するロールが自動的に割り当てられます。これらのレコードが削除されると、関連付けられたロールから自動的に削除されます。

概要:

この記事では、Laravel で権限を自動的に割り当てて再利用する方法を紹介しました。ポリモーフィック関連付け機能とイベント リスナーを使用して、ユーザー、ロール、投稿、コメントを関連付け、自動的にロールを割り当ててリサイクルしました。同時に、Laravel で権限管理を実装する方法をより深く理解するのに役立つ詳細なコード例も提供します。

以上がLaravelでパーミッションの自動割り当てとリサイクルを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!