web-dev-qa-db-ja.com

Laravel 5.3承認されていないユーザーをリダイレクトする方法に関するポリシー

ドキュメンテーションでは見つかりません。無許可のユーザーをリダイレクトする方法は?

RolePolicy.php

class RolePolicy
{
    use HandlesAuthorization;

    public function manageRoles(User $user)
    {
        return $user->isAdmin();
    }
}

RolesController.php

function __construct()
{
    $this->authorize('manageRoles', Role::class);
}

前もって感謝します

11
Kris MP

ファイルを変更できます_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_を作成するだけです。

8

私の知る限り、これは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

3
Devon

コントローラーメソッドで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);

https://stackoverflow.com/a/38611737/61310

0
Bruce Tong

私はいくつかのロジックを実装しました、それが誰かを助けることを望みます。
まず、たとえば$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);
        }
    });
}
0
Mustafa Omar