Laravel集团多个中间件

问题描述 投票:0回答:3

在我的应用程序中,我有三个用户角色:

  1. 用户
  2. 编辑
  3. 管理

当编辑器登录到管理部分时,隐藏了一些部分(用户管理,系统信息等),当然,管理员可以看到所有内容。

因此,为此我创建了两个中间件:Admin和Editor。这是代码。

管理中间件。

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class Admin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
          if(Auth::user()->role_id == 3) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

编辑器中间件:

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class Editor
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
          if(Auth::user()->role_id == 2) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

这是内核的一部分:

protected $routeMiddleware = [

'admin' => \App\Http\Middleware\Admin::class,
'editor' => \App\Http\Middleware\Editor::class,

];

现在我正在尝试构建可供这些用户角色使用的路由。如果我只为管理员或编辑器这样做,它工作正常,但当我合并它们时,一个用户可以登录而另一个用户不能。

这是仅针对管理员的代码,它工作正常。

Route::middleware('admin')->group(function(){

  Route::get('/admin', 'PagesController@adminIndex');
  Route::resource('/admin/pages', 'PagesController');
  Route::resource('/admin/news', 'NewsController');
  Route::resource('/admin/users', 'UsersController');
  ...
});

我试图将它们与此代码结合使用,但它无法正常工作(根本无法登录管理部分):

Route::middleware(['admin', 'editor'])->group(function(){

  Route::get('/admin', 'PagesController@adminIndex');
  Route::resource('/admin/pages', 'PagesController');
  Route::resource('/admin/news', 'NewsController');
  Route::resource('/admin/users', 'UsersController');
  ...
});

我怎么解决这个问题?

附:后来我也想为User角色构建一个逻辑,所以必须有一种方法来组合路由。

laravel routes middleware
3个回答
2
投票

您可以在Middleware Parameters的帮助下解决问题,而不是每个角色的几个中间件只使用一个角色作为参数的通用中间件。

例如:

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

中间件:

<?php

namespace App\Http\Middleware;
use Illuminate\Support\Facades\Auth;

use Closure;

class CheckRole
{
    public function handle($request, Closure $next, ...$roles)
    {
        $roleIds = ['user' => 1, 'editor' => 2, 'admin' => 3];
        $allowedRoleIds = [];
        foreach ($roles as $role)
        {
           if(isset($roleIds[$role]))
           {
               $allowedRoleIds[] = $roleIds[$role];
           }
        }
        $allowedRoleIds = array_unique($allowedRoleIds); 

        if(Auth::check()) {
          if(in_array(Auth::user()->role_id, $allowedRoleIds)) {
            return $next($request);
          }
        }

        return redirect('/');

    }
}

路线:

Route::middleware(['checkRole:admin,editor'])->group(function(){
  //Your routes  
});

1
投票

它应该如下。

Route::middleware(['auth'])->group(function(){
//common routes will goes here

   Route::middleware(['admin'])->group(function(){//admin routes will goes here
      Route::get('/admin', 'PagesController@adminIndex');
      Route::resource('/admin/pages', 'PagesController');
      Route::resource('/admin/news', 'NewsController');
      Route::resource('/admin/users', 'UsersController');
   });

    Route::middleware(['editor'])->group(function(){
       //editor routes goes here.
    });


});

0
投票

问题是您的中间件(['admin','editor'])正在检查这两个角色,即管理员,用户编辑器,并且您只有一个用户角色。这就是为什么它不起作用的原因

有很棒的软件包可以管理易于使用的用户角色。我建议你使用Spatie Laravel Permission,如果你想要它的教程,请观看Bitfumes Video

© www.soinside.com 2019 - 2024. All rights reserved.