我想知道我是否可以在Laravel Route中这样做。假设我有Admin
,Premium
和User
(也可以使用Auth
)中间件登录。另外,我有控制器使用这样的方法:index
,create
,edit
,delete
我希望Admin
能够做所有这些事情,但是Premium
只能访问index
方法,而User
无法访问此控制器中的任何内容(他可以访问其他控制器)。我知道我可以像这样使用except
或only
中间件方法:
public function __construct()
{
$this->middleware('premium')->only('index');
$this->middleware('admin');
// or maybe $this->middleware('admin')->except('index');
}
但是当我尝试将这两个中间件放在__construct
方法中时,它们将开始相互冲突,这是有道理的,因为索引方法可以由Premium Member
访问,但是后来无法访问Admin
本身。顺便说一句,我的中间件只是检查:
if (Auth::check()) {
if (Auth::user()->role == 'Admin') {
return $next($request);
}
}
return redirect('/home');
所以,回到我的问题,我可以拥有OR中间件,这样我就可以避免来自多个中间件的冲突(当它们在同一个控制器构造函数中编写时必须是AND条件)?
非常感谢。
答案 0 :(得分:2)
如果你改变逻辑思路的方式,那么答案就变得非常简单了。您可以创建新的中间件来检查它是否可以访问特定方法。
所以创建以下中间件' CanAccessIndex':
if (Auth::check()) {
if (Auth::user()->role == 'Admin' || Auth::user()->role == 'Premium') {
return $next($request);
}
}
return redirect('/home');
然后,您可以将该中间件放在索引功能(而不是高级中间件)上,并将管理中间件放在除索引之外的所有内容上。像这样:
public function __construct()
{
$this->middleware('canAccessIndex')->only('index');
$this->middleware('admin')->except('index');
}
这是一种方法。
答案 1 :(得分:1)
您需要中间件组,要管理这些访问层的层次结构,您只需使用路由分组。
我将演示一个我的意思的例子:
假设您为经过身份验证的用户(即每个人)拥有auth
个中间件,然后为高级会员提供另一个称为premium
,为管理员提供admin
。
然后,您将根据访问级别进行分组:
Route::middleware('auth')->group(function(){
Route::middleware('premium')->group(function(){
Route::post('/create', 'HomeController@create')->middleware('admin');
Route::put('/update/{id}', 'HomeController@update')->middleware('admin');
Route::get('/index', 'HomeController@index');
Route::put('/delete/{id}', 'HomeController@delete')->middleware('admin');
});
});
因此,您可以通过支票对中间件进行一般性检查。如果您的管理员角色级别为3,高级会员级别为2,则会容易得多。所以我们可以拥有高级中间件:
public function handle($request, Closure $next)
{
return auth()->user->role >= 2
? $next($request)
: redirect('/home');
}
这只是一个例子。您可以根据需要进行进一步检查,但更重要的是,确保您的admin
中间件检查允许的确切角色级别。