Laravel 6执行基于角色的路由



我有一个具有不同路由的路由组。我希望在不更改应用程序URL的情况下拥有不同角色级别的访问权限。

例如,我想让/admin作为路由,然后我想根据用户的角色允许或禁止用户。基本上,我希望每个用户都能看到相同的页面,但有不同的菜单选项(我知道如何做到这一点(,但也要确保链接不被直接访问。

有没有一种很好的方法可以实现这一点,而不需要在每条路线上分别使用不同的中间件?因为似乎没有办法在web.php文件中检索$request变量,而只能在控制器中检索。我正在使用sentinel包进行身份验证。

我的web.php的一些示例代码:

Route::group(
['prefix' => 'admin', 'middleware' => 'customer', 'as' => 'admin.'],
function () {
// Ad list
Route::get('getMyAnnonsList', 'AdminBackEndController@getMyAdList')->name('getMyAdList');       
}
);

@lagbox的回答很好。这就是我最终所做的。非常优雅。

web.hp:

Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () {
Route::middleware('admin:admin,user')->group(function(){
Route::get('getMyAnnonsList', 'AdminBackEndController@getMyAdList')->name('getMyAdList'); 
});
});

中间件:

public function handle($request, Closure $next, ...$roles)
{      
if (!Sentinel::check()) 
return redirect('admin/signin')->with('info', 'You must be logged in!');

foreach($roles as $role)        
if($role == Sentinel::getUser()->roles[0]->slug)
return $next($request);        

return redirect()->back();  
}

我之前已经回答过这样的问题,应该仍然可以正常工作。

您可以创建一个可以应用于您的组的中间件。在该中间件中,它要求路由本身检查特定的角色。

如何将两个中间件分配给同一组路由。Laravel

中间件示例:

class CheckMiddleware
{
public function handle($request, Closure $next)
{
$roles = $request->route()->getAction('roles', []);
foreach ((array) $roles as $role) {
// if the user has this role, let them pass through
if (...) {
return $next($request);
}
}
// user is not one of the matching 'roles'
return redirect('/');
}
}

路线定义示例:

Route::middleware('rolescheck')->group(function () {
Route::get('something', ['uses' => 'SomeController@method', 'roles' => [...]])->name(...);
});

您可以在组级别、单个路由级别或两者上应用此任意数据,因为所有路由都是单独注册的;组只允许级联配置。

您也可以让这个中间件接受参数,并将它们与任意角色合并,这样它就是一个两用中间件:

public function handle($request, $next, ...$roles)
{
$roles = array_merge($roles, $request->route()->getAction('roles', []));
...
}
Route::middleware('rolescheck:admin,staff')->group(...);

您可以使用Laravel Gate和Policies

您可以在App > Providers > AuthServiceProvider内定义闸门

并且还可以为每个CCD_ 2创建策略。请参阅php artisan help make:policy中的信息。这将在您的app中创建一个名为策略的文件夹,您可以定义谁可以访问它。

在您的控制器中,您可以这样做:(这是一个网关中间件(

我首先定义闸门:

Gate::define('check', function ($user, $request) {
return $user->roles->contains('name', $request) || $user->roles->contains('name', 'root');
});

然后我在控制器中初始化它

abort_if(Gate::denies('check', 'admin only'), 403);

如果用户没有访问该角色的权限,这将引发403错误。它将检查用户是否具有admin only角色。如果它没有,它将抛出错误

在你看来,如果你想禁用anchor links,你可以这样做:

@can('check', 'admin only')
<a href="/admin/dashboard">dashboard</a>
@endcan

编辑:控制器

public function index() {
abort_if(Gate::denies('check', 'admin only'), 403);
// Your Code...
}

最新更新