【问题标题】:Multiple middleware in controller Laravel 5.4控制器 Laravel 5.4 中的多个中间件
【发布时间】:2017-09-21 18:55:52
【问题描述】:

我想在我的控制器的__construct 方法中使用两个中间件。过去几个小时我在谷歌搜索,但没有找到任何有用的资源。

这是我的__construct 和中间件:

public function __construct()
{
    $this->middleware('adminuser');
    $this->middleware('generaluser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}

我想为普通用户授予访问这些 generaluser 中间件方法的权限。 我是怎么做到的?

请帮我解决这个问题。

谢谢

【问题讨论】:

  • 你的代码做你想做的事。有什么问题?
  • 嗨 Rajabi,我有一个 AdminUser 控制器类,其中包含许多方法,管理员用户可以访问这些方法。但我想从 AdminUser 控制器类中为 GeneralUser 提供一些方法。就像我问的那样。

标签: laravel laravel-5 laravel-5.4 middleware


【解决方案1】:

因此,您需要对中间件使用“OR”之类的东西,但它并不存在。相反,您可以使用 middleware parameters 并在中间件中发挥作用。

创建一个中间件来检查您那里的所有角色,而不是为每个角色创建一个中间件。

use Closure;

class CheckRole
{
    public function handle($request, Closure $next, $role)
    {
        $roles = array_except(func_get_args(), [0,1]) // get array of your roles.

        // $request->user()->role IS AN EXAMPlE
        if (! in_array($request->user()->role, $roles)) {
            // Redirect...
        }

        return $next($request);
}

接下来就是在kernel.php中注册,routeMiddleware数组:

'role' => \App\Http\Middleware\CheckRole::class,

然后就可以同时查看多个角色了

$this->middleware('role:adminuser')->only('functionA', 'functionB');

$this->middleware('role:adminuser,guestuser')->only('functionC', 'functionD');

注意:这是一个示例,您可以随意更改中间件内部的逻辑。

【讨论】:

  • 您好感谢您的宝贵回答,我想为两个用户提供相同的访问方法。没有不同的方法:)
  • 我觉得有些不对劲。如果您需要授予访客用户访问权限,为什么要设置 guestuser 中间件?默认情况下,他们可以访问这些方法。
  • 只有两个用户可以访问这些方法,其他用户不能,这是错的吗??我不知道请建议我正确的方法。
  • 您的中间件需要类似“OR”的东西,但它不存在。相反,您可以使用中间件参数并根据它们处理逻辑。
  • @MDIyasinArafat 很好。我看到了你的代码。如果你需要更动态和安全的方式来检查角色和权限,我建议你使用这个包github.com/DynamicCodeNinja/RBAC。不要忘记接受并投票给答案:)
【解决方案2】:

在你的路由文件中使用中间件,而不是在结构内部

Route::middleware(['adminuser'])->group(function () {

   //Only admins can access this

    Route::get('/','Controller@method');
    Route::get('/admins','Controller@method');
});

Route::middleware(['generaluser'])->group(function () {

    // General users access this

    Route::get('/users', 'Controller@method');
    Route::get('/generalusers', 'Controller@method');
});

如果你想同时使用两个中间件

Route::middleware(['firstMiddleWare','secondMiddleWare'])->group(function () {
    Route::get('/aroute', 'Controller@method');
});

不属于组的路由将可供所有用户使用

【讨论】:

  • 您好 Khouadja,感谢您的宝贵回答。但我的问题不是这样,我有一个 AdminUser 控制器类,其中包含许多方法,并且管理员用户能够访问这些方法。但我想从 AdminUser 控制器类中为 GeneralUser 提供一些方法。就像我问的那样。
  • 这正是我的回答:) 你只是不明白!只需将您要共享的路线放在一般用户组中即可
  • 哦,对不起。是的,我没明白。我在我的路由文件中做了另一项工作,这就是为什么我不想在我的路由文件中使用中间件,因此,我正在使用 __construct。无论如何感谢您的信息。真的我不知道,现在我知道了,如果需要我会申请:)
【解决方案3】:

我猜adminuser 中间件允许管理员用户并阻止其他用户,因此非管理员永远无法访问generaluser 中间件。 您可以尝试从 adminuser 中间件中排除 generaluser 方法:

public function __construct()
{
    $this->middleware('adminuser')->except('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
    $this->middleware('generaluser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}

【讨论】:

  • 嗨 Lvan,感谢您的宝贵回答。不像那样,我有一个 AdminUser 控制器类,其中包含许多方法,并且管理员用户能够访问所有这些方法。但我想从 AdminUser 控制器类中为 GeneralUser 提供一些方法。就像我问的那样。
  • 是的,我在发帖后就想到了 :-) Achraf Khouadja 的建议,这似乎是最好的方法
  • 是的,但是我需要为一种方法授予两个用户的访问权限,这就是为什么我不能关注他的回答:)
【解决方案4】:

非常感谢Morteza Rajabi 给了我这个想法,这是我应用他的想法的代码。

我正在为两个用户创建一个新的中间件,这里是代码:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfNotAdminUserOrGeneralUser
{
    public function handle($request, Closure $next, $guard = null)
    {
        switch ($guard) {
            case 'adminuser':
                if (!Auth::guard($guard)->check()) {
                    return redirect('/');
                }
            break;
            case 'generaluser':
                if (!Auth::guard($guard)->check()) {
                    return redirect('/');
                }
            break;
        }
        return $next($request);
    }
}

并将其应用到我的控制器中,就像这样,并按我的意愿授予他们访问权限。 管理员用户可以访问所有方法,普通用户可以访问其中一些方法。这意味着两个用户可以访问相同的方法。

这是控制器代码:

    public function __construct()
{
    $this->middleware('adminuser')->only('index','create','edit','store','delete','trashIndex','restore','permanentlyDelete','addGroups','addGroupsStore','addQuestions','addQuestionsStore','countGroup','countQuestion');
    $this->middleware('auserorguser')->only('quizDetails','validateQuiz','attemptQuiz','submitQuiz','saveAnswer','setIndividualTime');
}

再次感谢 Morteza Rajabi。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2020-02-12
    • 2018-01-25
    • 2023-03-18
    • 2019-02-26
    • 2017-09-20
    • 2017-12-18
    相关资源
    最近更新 更多