Php Laravel中间件多角色

Php Laravel中间件多角色,php,laravel,user-permissions,laravel-middleware,laravel-7,Php,Laravel,User Permissions,Laravel Middleware,Laravel 7,我正在讨论Laravel中间件的一些问题。我想完成的是注册用户有4个角色。1.行政硕士2。管理员3。卖方4。顾客我希望我的主管理员、管理员和卖家能够访问我的CategoryController,而客户无法访问它,但当我将中间件放入控制器的构造函数时,它只允许主管理员访问CategoryController并返回管理员和卖家用户。请告诉我怎么做 Kernel.php$RouteMiddle软件: 'checkrole' => \App\Http\Middleware\CheckRol

我正在讨论Laravel中间件的一些问题。我想完成的是注册用户有4个角色。1.行政硕士2。管理员3。卖方4。顾客我希望我的主管理员、管理员和卖家能够访问我的CategoryController,而客户无法访问它,但当我将中间件放入控制器的构造函数时,它只允许主管理员访问CategoryController并返回管理员和卖家用户。请告诉我怎么做

Kernel.php$RouteMiddle软件:

    'checkrole' => \App\Http\Middleware\CheckRole::class,
    'admincheck' => \App\Http\Middleware\Admin::class,
    'sellercheck' => \App\Http\Middleware\Seller::class,
    'customercheck' => \App\Http\Middleware\Customer::class,
    'masteradmin' => \App\Http\Middleware\MasterAdmin::class,
http/中间件/检查角色

    public function handle($request, Closure $next)
{
    if(Auth::user()->user_role  == 1)
    {
      return redirect('admin');
    }
    elseif(Auth::user()->user_role  == 2)
    {
      return redirect('seller');
    }
    elseif(Auth::user()->user_role  == 3)
    {
      return redirect('customer');
    }
      return $next($request);
}
http/Middleware/MasterAdmin

    public function handle($request, Closure $next)
{
  if(Auth::user()->user_role != 0)
  {
    return back();
  }
    return $next($request);
}
http/Middleware/Admin

  public function handle($request, Closure $next)
{
  if(Auth::user()->user_role != 1)
  {
    return back();
  }
    return $next($request);
}
http/中间件/卖方

  public function handle($request, Closure $next)
{
  if(Auth::user()->user_role != 2)
  {
    return back();
  }
    return $next($request);
}
Http/中间件/客户

    public function handle($request, Closure $next)
{
    if(Auth::user()->user_role != 3)
    {
      return back();
    }
    return $next($request);
}
类别控制器:

    class CategoryController extends Controller
{
    public function __construct()
    {
      $this->middleware('auth');
      $this->middleware('verified');
      $this->middleware('masteradmin');
      $this->middleware('admincheck');
      $this->middleware('sellercheck');
      // $this->authorizeResource(Category::class, 'category');
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
     return view('category.index');
    }
家庭控制器

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('verified');
        $this->middleware('checkrole');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Contracts\Support\Renderable
     */
    public function index()
    {
        return view('home');
    }

它现在不起作用,我想让一个或多个用户访问我的整个控制器,请提前告诉我如何实现这一点,谢谢

问题是您的
adminUser
必须通过
masterAdminUser
中间件
返回()。因此,您的
adminUser
将没有机会通过管理中间件访问类别

解决方案是在单个中间件中处理角色管理,例如,
CategoryMiddleware
。该中间件将检查角色并
返回()仅当不允许时


一个更干净的Laravel解决方案是使用策略,这似乎非常适合您的情况-您可以看看。

我真的不理解问题:
它只检查第一个中间件
。你能详细说明一下吗?你好,我的意思是它只允许管理员管理员访问类别控制器。。。并返回卖家和管理员用户添加此
$this->中间件('auth')
belowStill在添加auth中间件BelowPolicys后仍然如此。对我来说,策略不起作用,但为控制器制作一个单独的中间件确实起到了作用。在这种情况下,将不得不制造太多的中间件,但是仍然做这个工作。您可能会考虑在这种情况下的角色/权限包——这将使您的生活EasiRelayExchange使用“空间许可证包”。你的建议节省了我很多时间