나는 여러 권한을 가진 다수의 사용자가 있습니다. 사용자는 단지 하나의 역할에 속할 수 있지만, 그 역할과 같은 여러 권한을 가질 수 있습니다 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');
깨끗한 방법으로 그 작업을 수행하는 가장 좋은 방법은 대상 기관에 정책을 생성하는 것입니다. 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');