어떻게 laravel Milldeware의 특정 역할과 사용자에게 특정 경로를 인증하기

단계 :

나는 여러 권한을 가진 다수의 사용자가 있습니다. 사용자는 단지 하나의 역할에 속할 수 있지만, 그 역할과 같은 여러 권한을 가질 수 있습니다 create, read, update, delete. 그리고 나는이 RoleMiddleware. 나는에서 사용자를 인증하고있다 roleMiddleware. 그러나 어떻게 보호 할 수 routes있는 RoleMiddleware특정 사용자에 대해?

예를 들어, 나는 경로가 create-case에만 액세스 할 수 있습니다 operator또는 의해 Admin에 다른 사람의 리디렉션 404 error내가 그것을 해결할 수있는 방법을 RoleMiddleware.

나는 그들의 역할을 가진 모든 사용자가 인증 인증을 위해 기본 코드를 작성한 그러나 나는 미들웨어에서 내가 어떻게 코드 그렇게도 경로를 얻고 때이 이동 할 수있는 사용자 히트 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=17123&siteId=1