サーチ…


前書き

Laravelは、特定のリソースに対するユーザーの操作を許可する簡単な方法を提供します。承認を使用すると、特定のリソースへのアクセスを選択的に許可し、他のリソースへのアクセスを拒否することができます。 Laravelは、 GatesPoliciesを使用してユーザー認証を管理するためのシンプルなAPIを提供します。 Gatesは、 AuthServiceProviderを使用した認可への簡単なクロージャベースのアプローチを提供し、 Policiesはクラスを使用してモデルの周りに認可ロジックを構成することを可能にします。

ゲイツの使用

Gatesは、ユーザーがリソースに対して特定のアクションを実行できるかどうかを決定するクロージャです。 Gatesは通常、 AuthServiceProviderのブートメソッドで定義され、 AuthServiceProviderを反映するために簡潔に名前が付けられます。プレミアムユーザーだけが一部のコンテンツを表示できるようにするゲートの例は、次のようになります。

Gate::define('view-content', function ($user, $content){
    return $user->isSubscribedTo($content->id);
});

Gateは、常に最初の引数としてユーザーインスタンスを受け取ります。ゲートを使用するときにゲートを渡す必要はなく、必要に応じて雄弁なモデルなどの追加の引数を受け取ることもできます。

ゲートによる承認アクション

上記の例をブレードテンプレートで使用して、ユーザーからのコンテンツを非表示にするには、通常次のようにします。

@can('view-content', $content)
 <! -- content here -->
@endcan

コンテンツへのナビゲーションを完全に防止するには、コントローラで次の操作を実行できます。

if(Gate::allows('view-content', $content)){
    /* user can view the content */
}

        OR

if(Gate::denies('view-content', $content)){
    /* user cannot view content */
}

注:これらのメソッドに現在認証されているユーザーを渡す必要はありませんが、Laravelがそれを処理します。

ポリシー

ポリシーとは、モデルリソースの周囲に認可論理を編成するのに役立つクラスです。前述の例を使用すると、 Contentモデルへのユーザーアクセスを管理するContentPolicyとします。

ContentPolicyを作成するために、laravelは職人のコマンドを提供します。単に実行する

php artisan make:policy ContentPolicy

空のポリシークラスが作成され、 app/Policiesフォルダに配置されます。フォルダが存在しない場合、Laravelはフォルダを作成し、クラスを内部に配置します。

作成したポリシーは、Laravelがモデルのアクションを承認する際に使用するポリシーを知るのを助けるために登録する必要があります。 LaravelのAuthServiceProviderには新しくLaravelがインストールされていますが、あなたの雄弁なモデルを認証ポリシーにマップするポリシープロパティがあります。配列へのマッピングを追加するだけです。

protected $policies = [
    Content::class => ContentPolicy::class,
 ];

ポリシーの作成

Policiesを書くことは、 Gatesを書くことと同じパターンに従います。コンテンツ許可ゲートは、次のようなポリシーとして書き換えられます。

function view($user, $content)
{
    return $user->isSubscribedTo($content->id);
}

ポリシーには、モデルのすべての認可ケースを管理するために、必要に応じてより多くのメソッドを含めることができます。

ポリシーによるアクションの認可

ユーザーモデルを介して

Laravel Userモデルには、 Policiesを使用した承認に役立つ2つのメソッドがあります。 can can't 。これらの2つを使用して、ユーザーがそれぞれモデル上で権限を持っているかどうかを判断できます。

ユーザーがコンテンツを表示できるかどうかを確認するには、次の操作を行います。

if($user->can('view', $content)){
    /* user can view content */
}

        OR

if($user->cant('view', $content)){
    /* user cannot view content */
}

ミドルウェア経由

Route::get('/contents/{id}, function(Content $content){
    /* user can view content */
})->middleware('can:view,content');

コントローラ経由で

Laravelはと呼ばれるヘルパーメソッド、提供authorize引数としてポリシーの名前と関連するモデルを取り、どちらかあなたの認可ロジックに基づいてアクションを許可またはアクションを拒否し、スローAuthorizationException Laravel例外ハンドラがに変換403 HTTP response

pubic function show($id)
{
    $content = Content::find($id);

    $this->authorize('view', $content);
        
    /* user can view content */
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow