【问题标题】:How can I set multiple middlewere in Controller's constructor in Laravel?如何在 Laravel 的 Controller 构造函数中设置多个中间件?
【发布时间】:2020-07-27 14:14:43
【问题描述】:

Kernel.php

'admin' => \App\Http\Middleware\Admin::class,
'super_admin' => \App\Http\Middleware\SuperAdmin::class,
'seller' => \App\Http\Middleware\Seller::class,

我创建了三个不同的middlewere。这是kernel.php中的那些人

例如,我想向所有这三个用户授予仪表板访问权限。 adminsuper_adminseller

DashboardController.php

function __construct()
{
    $this->middleware(['super_admin', 'admin', 'seller']);
}

但是这个多重中间没有工作

没有错误,但我无法访问管理员路由

单个中间件完美运行

参考文献

web.php

Route::get('admin', 'DashboardController@index')->name('dashboard.index');
Route::get('admin/shops', 'DashboardController@shops')->name('dashboard.shops');

【问题讨论】:

  • 你遇到了什么错误?
  • "但是这个多个中间件不起作用"是什么意思?你遇到了什么错误?您绝对可以将多个中间件作为数组传递给$this->middleware()
  • 问题可能是你有不同角色的三个不同的中间件,你应该有一个中间件,你可以传递所有应该有权访问的角色,否则super_admin 有访问权限,但是因为他不是adminseller,他没有访问权限。为了访问路由,请求必须通过所有中间件。
  • @ImrulHasan 看看middleware parameters,这样您就可以传递应该有权访问中间件的多个角色,然后您可以检查经过身份验证的用户是否拥有其中任何一个。
  • 你可能想看看route-filters,以防你试图保护特定的路线。你也可以group他们:)

标签: php laravel middleware


【解决方案1】:

我终于解决了这些问题

特别感谢 RemulPilan 兄弟提供宝贵的参考资料。

步骤 1

Middlewere/AdminPanel.php

public function handle($request, Closure $next, $super_adminRole, $adminRole,  $sellerRole)
{
    $roles = Auth::check() ? Auth::user()->role->pluck('name')->toArray() : [];

    if (in_array($super_adminRole, $roles)) {
        return $next($request);
    } else if (in_array($adminRole, $roles)) {
        return $next($request);
    } else if (in_array($sellerRole, $roles)) {
        return $next($request);
    }

    return Redirect::route('home');
}

roles 表中有 3 个角色。 super_adminadminseller

在数组$roles 中包含这些角色。

所以在if 条件下,null 与null 比较得到false,因此条件将不满足。

第二步

Kernel.php

protected $routeMiddleware = [
    'adminPanel' => \App\Http\Middleware\AdminPanel::class,
];

第三步

DashboardController.php

4 种变化

function __construct()
{
    $this->middleware(['adminPanel:super_admin,admin,seller']);
}

这里super_adminadminseller可以访问

function __construct()
{
    $this->middleware(['adminPanel:super_admin,null,null']);
}

这里super_admin可以访问

function __construct()
{
    $this->middleware(['adminPanel:null,admin,null']);
}

这里admin可以访问

function __construct()
{
    $this->middleware(['adminPanel:null,null,seller']);
}

这里seller可以访问


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多