MiddleWare

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を個別に書けば問題はないけど。