【问题标题】:Laravel Multiple Middleware in Route with OR Condition带有 OR 条件的 Laravel 路由中的多个中间件
【发布时间】:2018-05-16 00:51:09
【问题描述】:

我想知道我是否可以在 Laravel Route 中做到这一点。假设我有AdminPremiumUser(也可以使用Auth 登录)中间件。另外,我有这样的控制器:indexcreateeditdelete,我希望Admin能够做所有这些事情,但Premium只能访问@ 987654331@ 方法和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 条件)?

非常感谢。

【问题讨论】:

    标签: php laravel if-statement boolean middleware


    【解决方案1】:

    如果你稍微改变一下你的逻辑思维方式,答案就会变得很简单。您可以创建新的中间件来检查它是否可以访问特定方法。

    所以创建以下中间件'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');
    }
    

    这是一种方法。

    【讨论】:

    • 感谢您的建议。我曾经确实喜欢您的回答,但我害怕更改我的中间件,因为当您执行错误的逻辑时它们会变得如此混乱..
    【解决方案2】:

    为此你需要中间件组,并且要管理这些访问层的层次结构,你可以简单地使用路由分组

    我将演示一个示例来说明我的意思: 假设您有 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 中间件检查允许的确切角色级别。

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2021-09-30
      • 2019-09-22
      • 1970-01-01
      • 2015-08-31
      • 2012-11-06
      • 2016-08-27
      • 2015-03-19
      • 1970-01-01
      相关资源
      最近更新 更多