私はZizaco/entrustパッケージを使用している役割/権限ベースのlaravelアプリケーションを作成します。laravelのルートパスに基づいた動的なアクセス許可を経由して
今はweb.php
に異なるミドルウェアとしてルートに定義されたパーマを割り当てる必要がないことアプローチを使用すると、つまり:
最初に定義されたすべてのルート(Route::getRoutes()->getRoutes()
経由)をフェッチし、permissions
テーブルでそれらのそれぞれを格納します。
私たちは、このコードによって、すべてのルートを取得することができます:
$routes = collect(Route::getRoutes()->getRoutes())->reduce(function ($carry = [], $route) {
$carry[] = $route->uri();
return $carry;
});
一方、我々は、これらの権限を持つロールを定義することができますし、通常の方法でユーザにそれらを添付。
ユーザーがページにアクセスするには、最初にルートパス名を取得してから、can
メソッドで定義されていますが、ユーザーはそのルートにアクセスできるかどうかを確認します。これは、たとえばルートグループとしてすべてのルートに追加されたcheckAccess
という単純なミドルウェアを介して行うことができます。
class checkAccess
{
public function handle($request, Closure $next)
{
if (Auth::check()) {
$currentName = Route::getCurrentRoute()->getPath();
if (Auth::user()->can($currentName)) {
return $next($request);
}else{
return response()->view('errors.403', ['prevPage'=> URL::previous()]);
}*/
return $next($request);
}
return Redirect::to('/admin/login');
}
}
Route::middleware(['checkAccess'])->group(function() {
//Other routes
});
ただし、一部のリソースルートには同じルートパスがあり、メソッドアクセスが異なります。 like:
+-----------+-----------------+---------+----------------+
| METHOD | URL | Action | Route Name |
+-----------+-----------------+---------+----------------+
| GET | /photos/{photo} | show | photos.show |
| PUT/PATCH | /photos/{photo} | update | photos.update |
| DELETE | /photos/{photo} | destroy | photos.destroy |
+-----------+-----------------+---------+----------------+
これは重複するアクセス許可の原因です。実際には動作が異なりますが、
私は、動的に権限を作成するための相対的な方法があることを知りたいと思います。この場合、この問題を解決するために何ができますか?