具有OR条件的路径中的Laravel多个中间件

时间:2017-12-01 21:03:58

标签: php laravel if-statement boolean middleware

我想知道我是否可以在Laravel Route中这样做。假设我有AdminPremiumUser(也可以使用Auth)中间件登录。另外,我有控制器使用这样的方法:indexcreateeditdelete我希望Admin能够做所有这些事情,但是Premium只能访问index方法,而User无法访问此控制器中的任何内容(他可以访问其他控制器)。我知道我可以像这样使用exceptonly中间件方法:

    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条件)?

非常感谢。

2 个答案:

答案 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中间件检查允许的确切角色级别。