laravel Milldeware内の特定の役割を持つユーザーに特定のルートを認証する方法

フェーズ:

私は、複数の権限を持つ複数のユーザーを持っています。ユーザーは、単一のロールに属することができますが、その役割のような複数の権限を持つことができcreatereadupdatedeleteそして、私が持っていますRoleMiddleware私は、ユーザーを認証していますroleMiddlewareしかし、どのように私が保護することができますroutesRoleMiddleware、特定のユーザーに対して?

例えば、私はルート持っているcreate-caseだけでアクセスできるoperatorかによってAdminに皆のリダイレクト404 error私はそれに対処できる方法をRoleMiddleware

私は自分の役割を持つすべてのユーザーが認証された認証のための基本的なコードを書かれているが、ユーザがそれに行くことが当たったとき、私が今までの経路そうミドルウェアでどのようにすることができますIコードを取得していますRoleMiddlewareどこミドルウェアAuthenticateの役割へのルートと、その後彼にアクセス権を与えます。

役割ミドルウェア

class RoleMiddleware
{
    public function handle($request, Closure $next, $permission = null)
    {

        if (Auth::check() === false)
        {
            return redirect('login');
        }
        elseif (Auth::check() === true)
        {
            $roles = Role::all()->pluck('slug');

            if (is_null($request->user()) )
            {
                abort(404);
            }
            if (!$request->user()->hasRole($roles))
            {
                abort(404);
            }

            if ($request->user())
            {
                if ($request->user()->hasRole($roles))
                {
                    return $next($request);
                }
            }
        }
    }
}

ケースコントローラ:

<?php

namespace App\Http\Controllers\Cases;

use App\Http\Controllers\Controller;
use App\Http\Requests\CaseStoreRequest;
use Illuminate\Support\Facades\Auth;
use Session;

class CaseController extends Controller
{
    use DropzoneFileUploadTraits;

    public function __construct()
    {
        $this->middleware('role');

    }

    public function index()
    {
        $data['portal'] = Portal::all();
        $data['operators'] = Operator::all();

        return view('case', $data);
    }

    public function caseList()
    {
        $user = new User();
        $isAdmin = $user->isAdmin();

        $loggedIn = Auth::id();

        $cases = Cases::with('patients', 'portal')
            ->when(!$isAdmin, function ($query) use ($loggedIn) {
                return $query->where('user_id', $loggedIn);
            })->orderBy('created_at', 'desc')->get();

        $data['cases'] = $cases;

        return view('case_list', $data);
    }
}

ルート:

Route::get('create-case', 'Cases\CaseController@index')->name('create-case');
Route::post('case-submit', 'Cases\CaseController@caseSubmit')->name('case-submit');
Route::post('edit-patient-case-submit', 'Cases\CaseController@editPatientCaseSubmit')->name('edit-patient-case-submit');
Route::get('case-list', 'Cases\CaseController@caseList')->name('case-list');
elfif:

クリーンな方法でそれを行うための最善の方法は、対象のエンティティにポリシーを作成することです。Laravelポリシーはあなたをすることができます:

  • ポリシーアクションにルーティングする承認ロジックをバインド

  • 簡単にプロジェクト(ビュー、コントローラなど)のどこからポリシーアクションの結果を呼び出します。

私はあなたがそこに行くと見てみ示唆して被写体が良くLaravelのドキュメントで覆われています。ポリシーを登録し、モデルにバインドすることを忘れないでください。

それとは別に、これはトリックを行う必要があります。

class CasePolicy
{
    use HandlesAuthorization;

    public function create(User $user){
        $roles = ['operator','Admin']
        return $user->hasRole($roles);
    }
}

次に、あなたのルートファイルに:

Route::get('create-case', 'Cases\CaseController@index')->name('create-case')->middleware('can:create,App\Case');

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=17124&siteId=1