ドキュメンテーションでは見つかりません。無許可のユーザーをリダイレクトする方法は?
RolePolicy.php
class RolePolicy
{
use HandlesAuthorization;
public function manageRoles(User $user)
{
return $user->isAdmin();
}
}
RolesController.php
function __construct()
{
$this->authorize('manageRoles', Role::class);
}
前もって感謝します
ファイルを変更できます_app\Exceptions\Handler.php
_
レンダリング機能で:
_public function render($request, Exception $e)
{
/**modified part**/
if ($request->wantsJson()) {
return response([
'success' => false,
'message' => $e->getMessage()
], 404);
}
if ($e instanceof AuthorizationException) {
return redirect('path');
//or simply
return view('errors.forbidden');
//but this will return an OK, 200 response.
}
/**end of modified part**/
return parent::render($request, $e);
}
_
403を置きたい場合は、ヘルパー関数response()
を使用してください。応答のドキュメントはこちら https://laravel.com/docs/master/responses
基本的には、このソリューションを使用して、より多くのオプションを試すことができます。しかし、最も簡単な方法は、ビューファイルを作成することです:_
errors/403.blade.php
_。このビューは、権限のない例外が発生したときに自動的にロードされます。同じことが404 not foundでも機能し、_404.blade.php
_を作成するだけです。
私の知る限り、これはLaravel 5.3でも同じです。Laravel 5.のどのバージョンでも同じです。
App\Http\Middleware\Authenticate
を参照するauth
というルートミドルウェアがあります(app/http/Kernel.phpで定義)
このクラスでは:
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('login');
}
}
return $next($request);
}
このauth
ミドルウェアは、認証が必要なルートに適用できます。
ここでミドルウェアの詳細をお読みください: https://laravel.com/docs/5.3/middleware
認証の詳細については、こちらをご覧ください: https://laravel.com/docs/5.3/authentication
コントローラーメソッドでLaravel Gates、を使用します。例:
public function update(Role $role){
if(\Gates::allows('manageRoles',$role)) {
return redirect()->back()->with('status','Success');
}
ただし、個人的には、すべてのコントローラーアクションにリダイレクトページを設定するのは面倒すぎると思います。アクションが拒否された場合、ユーザーはURLを操作しましたが、いくつかの前提条件が完了していないためではありません。ホームボタンのあるまっすぐな404ページで十分です。
上記の答えが言うように、Laravel応答を使用し、必要なエラーページを呼び出してカスタムメッセージを渡すだけの方がはるかに優れて簡単です。
別のスレッドからのこの回答のように:
return response("User can't perform this action.", 401);
私はいくつかのロジックを実装しました、それが誰かを助けることを望みます。
まず、たとえば$this->anonymouslyAuthorize($model)
などのメソッドを呼び出します
たとえばPostControllerのメソッド
public function show(Post $post)
{
$this->anonymouslyAuthorize($post);
// The user is authorized.
}
controllersディレクトリに残っているベースコントローラに、このメソッドを追加します。
public function anonymouslyAuthorize($model)
{
Auth::user()->can('see', $model);
}
ブートメソッドのAuthServiceProviderで、このゲートを定義します。
public function boot()
{
$this->registerPolicies();
Gate::define('see', function ($user, $model) {
if ($user->id !== $model->user_id) {
abort(404);
}
});
}