【发布时间】:2020-07-10 00:40:59
【问题描述】:
我有一个包含不同路线的路线组。我希望在不更改应用程序 URL 的情况下拥有不同角色级别的访问权限。
例如,我想将 /admin 作为路由,然后我想根据用户的角色允许或禁止用户。基本上,我希望每个用户都能够看到相同的页面,但具有不同的菜单选项(我知道如何做到这一点),而且还能保护链接不被直接访问。
有没有一种很好的方法来实现这一点,而无需在每条路由上分别使用不同的中间件?由于似乎没有办法在 web.php 文件中检索 $request 变量,而只能在控制器内部检索。我正在使用 sentinel 包进行身份验证。
我的 web.php 的一些示例代码:
Route::group(
['prefix' => 'admin', 'middleware' => 'customer', 'as' => 'admin.'],
function () {
// Ad list
Route::get('getMyAnnonsList', 'Admin\BackEndController@getMyAdList')->name('getMyAdList');
}
);
@lagbox 的好答案。这就是我最后所做的。非常优雅。
web.php:
Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () {
Route::middleware('admin:admin,user')->group(function(){
Route::get('getMyAnnonsList', 'Admin\BackEndController@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();
}
【问题讨论】:
-
你试过web.php文件中的
request()辅助方法吗?甚至Route::group的? -
是的。 $request 变量在 web.php 上不包含身份验证信息。这是 Laravel 设计的:web.php->route->middleware->controller。所以我尝试在中间件中填充 request 变量并且它有效但它只能在控制器中访问,因为它在中间件之后不会返回到 web.php 文件。
-
是的,我没有考虑过这个问题,但更具体地说,你似乎有一个问题是必须在“每条路由上”声明一个中间件,所以你没有使用资源路由、路由组、或者在 Controller::__constructor() 中声明中间件,这些都是为了减轻声明中间件的负担。如果这不是您的问题,请澄清。
-
我不确定这里的实际问题是什么......你指的是什么不同的中间件?
-
主要问题是我想在 web-php 文件中的路由组内允许不同的角色,然后根据用户角色允许访问不同的链接/路由。一种方法是使用 2 个不同的中间件创建同一个组,并在每个组中包含不同的路由。我想知道是否可以使用包含所有路由的单个组并使用简单的 if 语句来允许或禁止访问。