MVCモデルだとViewはロジックを含まない。
DropDownBoxの既定値の判断なんかはあるけれど。
選択されたURLにアクセス制限がある場合、どこで判断させるのか。
よく使われる認証の問題。
権限のRollでDenyURLを登録している場合、ログインしているユーザーからその権限を取り出し、
その権限が登録してあるロールの制限にアクセスするURLが該当するか調べる必要がある。
Controllerでやるとなるとかなり大変。
アドミンユーザーでログインして、アドミンユーザーに権限(authorituy)が登録されており、
権限が必要に応じてロール(authority_roll)に登録してあるなら、
Auth::user()でAdminが取得できるので、その権限、またそのロール(複数)で取り出せる。
$items=Auth::user()->authority->authority_rolls;
foreach($items as $item){
if(strpos($request->url(),$item->deny_url)!==false){
return redirect('admin/dashboard');
}
}
\app\Http\Middleware配下にPHP ファイルを作成しこのコードを実装。
\app\Http\Kernel.phpにミドルウェアとして登録。
ルートとして優先順位最下位で登録した。名前はdeny
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'deny' => \App\Http\Middleware\DenyUrls::class,
];
ミドルウェアはweb.phpのルーティングの後ろにつけるだけで良い。
Route::get('admin/orders', [MenuController::class,'orders'])->middleware('auth:admin')->middleware('deny');
しかし、RESTfulにルーティングするため、Route::resource と書いた場合はエラーが発生する。
個別のアクションへのルーティングでないと、Auth::が動作しない。
しかも、先に、middleware('auth:admin')がないと同じエラーが発生。(よくわかりません)
メニュー段階で選択できないようにはできるので、問題ないが、念のため、最初に表示することになるindexアクションだけ抑えてみた。
Route::resource('admin/settings/authority',AuthorityController::class, ['except' => ['index']])->middleware('auth:admin');
Route::get('admin/settings/authority', [AuthorityController::class,'index'])->name('authority.index')->middleware('auth:admin')->middleware('deny');
RESTfulにルーティングするときには、indexをexceptして、あとから、indexだけ追加している。
index, create, store, edit, update, show, destroyを個別に書けば問題はないけど。