サーチ…
前書き
Laravelは、特定のリソースに対するユーザーの操作を許可する簡単な方法を提供します。承認を使用すると、特定のリソースへのアクセスを選択的に許可し、他のリソースへのアクセスを拒否することができます。 Laravelは、 Gates
とPolicies
を使用してユーザー認証を管理するためのシンプルな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 */
}