検索
ホームページPHPフレームワークLaravelLaravelでパーミッションの自動割り当てとリサイクルを実装する方法

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

Nov 04, 2023 am 11:03 AM
laravel権限を自動的に割り当てる権限を自動的に再利用する

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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
技術的なトラブル:分散型チームメンバーのツールとリソースへの公平なアクセスを確保する技術的なトラブル:分散型チームメンバーのツールとリソースへの公平なアクセスを確保するApr 29, 2025 am 12:40 AM

分散したチームメンバーがツールやリソースに公正にアクセスできるようにする方法には、次のものが含まれます。1)接続の問題を解決するために、非同期ビデオやテキストの更新などの低帯域幅の代替品を使用します。 2)コアの重複労働時間を設定し、タイムゾーンの違いを管理するための柔軟な労働時間を提供する。 3)翻訳機能と文化的啓発トレーニングを通じて、さまざまな文化的ニーズに適応します。これらの戦略は、包括的で効率的なリモート作業環境の作成に役立ちます。

インスタントメッセージング必須ヘイブ:リモート設定でのリアルタイム通信の促進インスタントメッセージング必須ヘイブ:リモート設定でのリアルタイム通信の促進Apr 29, 2025 am 12:38 AM

forenhancingRemoteCollaboration、anintantmessagingToolMusthave:1)信頼性のforconsistmessagedelivery、2)Anintuitiveuserfaceforeasynavigation、3)real-timeNotificationStayUpdated、4)SeamlessefileSharing forefficientDocumentexchange、5)統合

分散型チームで働いている間に課題に直面したことはありますか?分散型チームで働いている間に課題に直面したことはありますか?Apr 29, 2025 am 12:35 AM

ManagingDistributedTeamSiscommunication.toAddressthis、Usetoolslikeslack、Zoom、andgithub; setClearExpectations; fostertrustandautonomy; emplional asynchronousworkpatterns; and integreatetaskManagementionwithCommunicationPlatfortfortforfoltivedive

新しいLaravelバージョンのセキュリティ改善は何ですか?新しいLaravelバージョンのセキュリティ改善は何ですか?Apr 29, 2025 am 12:17 AM

Laravelの最新バージョンは、以下を含むセキュリティを大幅に改善しました。1。CSRF保護の強化は、より堅牢なトークン検証メカニズムを介して。 2。強化されたクエリ構築方法を通じて、SQL注入保護の改善。 3.ユーザーデータセキュリティを確保するためのセッション暗号化の改善。 4。認証システムの改善、より細かい粒状ユーザー認証と多要素認証(MFA)をサポートします。

タイムゾーンタンゴ:グローバルな労働力におけるスケジューリングの競合をナビゲートするタイムゾーンタンゴ:グローバルな労働力におけるスケジューリングの競合をナビゲートするApr 29, 2025 am 12:13 AM

ConchedulingConflictsinaglobalworkforce、usetechnology、共感、および戦略的計画:1)1)雇用を採用しています

Laravelを使用したフルスタック開発:APIとフロントエンドロジックの管理Laravelを使用したフルスタック開発:APIとフロントエンドロジックの管理Apr 28, 2025 am 12:22 AM

Laravelフルスタック開発では、APIとフロントエンドロジックを管理するための効果的な方法には次のものがあります。1)RESTFULコントローラーの使用とリソースルーティング管理API。 2)ブレードテンプレートとvue.jsまたはReactを介したフロントエンドロジックの処理。 3)APIバージョン化とページングを通じてパフォーマンスの最適化。 4)保守性とスケーラビリティを確保するために、バックエンドとフロントエンドのロジックの分離を維持します。

翻訳の紛失:分配されたチームの文化的ニュアンスと誤解翻訳の紛失:分配されたチームの文化的ニュアンスと誤解Apr 28, 2025 am 12:22 AM

totackleculturalintricaciesindistributedteams、fosteranenvironmentebreatingdifferences、vemindfulofcommunication、およびusetoolsforclarity.1)CulturalExchangesSsionsistoriesSionsandtraditions.2)CommunicationMethodStosuitCultulpreference

接続の測定:リモート通信の有効性に関する分析と洞察接続の測定:リモート通信の有効性に関する分析と洞察Apr 28, 2025 am 12:16 AM

COMSESTESTESTESTESTESTESTESTESTESTESTESTESTEREMOTECommunication、Focuson:1)EngagementMetricsLikeMessageFRequenceAndResponsetime、2)SentimentAnalysistogaugeMotionaltone、3)Meating fisondentivencivitionSanceAndAnceAndActionItems、and4)netarysistoundErtindErtindESTANDSTANDCOMMUNICATIONPA

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール