Laravel中间件多重角色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel中间件多重角色相关的知识,希望对你有一定的参考价值。

我正在研究Laravel中间件的一些问题。我要完成的是注册用户具有4个角色。 1.主管理员2.管理员3.卖方4.客户。我希望我的主管理员,管理员和卖方可以访问我的CategoryController,而客户不能访问它,但是当我将中间件放入控制器的构造函数中时,它只允许masteradmin访问CategoryController并返回admin和卖方用户。请为我提供建议。

Kernel.php $ routemiddleware:

    '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 / Middleware / CheckRole

    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 / Middleware /卖方

  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);

CategoryController:

    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');
    

HomeController

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将必须通过masterAdminUserreturn back();中间件。因此,您的adminUser将没有机会通过管理员中间件,也无法访问类别。

一种解决方案是在单个中间件(例如CategoryMiddleware)中处理角色管理。该中间件将检查角色,并且仅在不允许的情况下检查return back();

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

以上是关于Laravel中间件多重角色的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多重身份验证保护路由多个中间件不起作用

具有多个角色的 Laravel 中间件

php Laravel的多角色权限中间件

在 laravel 中使用中间件保护路由

如何将字符串或数组发送到 laravel 中间件

无法基于角色 Laravel 8 保护路由