私は、複数の権限を持つ複数のユーザーを持っています。ユーザーは、単一のロールに属することができますが、その役割のような複数の権限を持つことができcreate
、read
、update
、delete
。そして、私が持っていますRoleMiddleware
。私は、ユーザーを認証していますroleMiddleware
。しかし、どのように私が保護することができますroutes
でRoleMiddleware
、特定のユーザーに対して?
例えば、私はルート持っている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');
クリーンな方法でそれを行うための最善の方法は、対象のエンティティにポリシーを作成することです。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');