【发布时间】:2018-05-11 13:03:35
【问题描述】:
要创建基于角色/权限的 laravel 应用程序,我正在使用 Zizaco/entrust 包。
现在我想使用一种方法,不需要将定义的权限分配给路由作为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
});
但是一个问题是一些资源路由有相同的路由路径但不同的方法访问。喜欢:
+-----------+-----------------+---------+----------------+
| METHOD | URL | Action | Route Name |
+-----------+-----------------+---------+----------------+
| GET | /photos/{photo} | show | photos.show |
| PUT/PATCH | /photos/{photo} | update | photos.update |
| DELETE | /photos/{photo} | destroy | photos.destroy |
+-----------+-----------------+---------+----------------+
这会导致重复的权限名称,尽管它们在操作上确实不同。
我想知道是否有任何相对的方式来创建动态权限。或者在这种情况下我该怎么做才能解决这个问题?
【问题讨论】:
标签: php laravel laravel-5.5