【问题标题】:Laravel middleware multiple rolesLaravel 中间件多角色
【发布时间】:2020-08-08 23:24:42
【问题描述】:

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

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/中间件/管理员

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

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

【问题讨论】:

  • 我不太明白这个问题:it only checks the first middleware。能详细点吗?
  • 你好,我的意思是它只让主管理员访问类别控制器......并返回卖家和管理员用户
  • 你在下面添加这个$this->middleware('auth');
  • 下面添加auth中间件后还是一样

标签: php laravel user-permissions laravel-middleware laravel-7


【解决方案1】:

问题是您的adminUser 必须通过masterAdminUser 中间件return back();。因此,您的 adminUser 将没有机会通过管理中间件,也无法访问类别。

解决方案是在单个中间件中处理您的角色管理,例如CategoryMiddleware。此中间件仅在不允许时检查角色和return back();

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

【讨论】:

  • 策略不适合我,但是为控制器制作一个单独的中间件可以完成这项工作。在这种情况下将不得不制作太多中间件,但仍然可以完成工作谢谢
  • 在这种情况下,您可以考虑使用角色/权限包 - 这会让您的生活更轻松
  • 感谢使用 spatie 权限包。你的建议为我节省了很多时间。 :)
猜你喜欢
  • 2019-09-21
  • 2017-10-09
  • 2021-12-30
  • 2016-10-03
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多