首页 > 解决方案 > 用户角色和权限。Laravel Fortify(不仅如此)

问题描述

包中是否有任何现成的功能Fortify用于设置用户角色和权限(普通用户、管理员、主管理员等)?如果不是,那么自己实施它的正确方法是什么?或者,在用户表中创建middleware一个is_admin字段。并进行检查:

if(Auth::user()->is_admin != 1){
    return redirect()->route('index');
}

路线:

Route::group(['middleware' => 'id_admin'], function(){
    Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
});

如果我有 2 个用户角色(0 是普通用户,1 是管理员),这很容易。但是,如果我有一个普通用户、一个管理员(可以编辑、更新、删除产品、类别等)和一个 CEO(可以授予和取消管理员权限、编辑用户数据和删除用户)怎么办?值得创建第二个middleware检查is_ceo吗?

第二middleware条路线:

Route::group(['middleware' => 'id_admin'], function(){
    Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
    Route::group(['middleware' => 'id_ceo'], function(){
        Route::get('/ceo-panel', [AdminController::class, 'ceo_panel'])->name('ceo_panel');
    });
});

是正确的方式吗?

标签: laravelauthenticationmiddlewarelaravel-fortify

解决方案


因为 Fortify 没有角色的解决方案,所以我不得不自己编写功能。

使用这个答案,我找到了适合我的案例的解决方案。我有 3 个权限级别。

0 - 普通用户,

1 - 管理员,

2 - 首席执行官。

在我的User模型中,我写了这个:

public function hasRole(){
      if($this->role === 2){
        return 1&&2;
      }else if($this->role === 1){
        return 1;
      }else{
        return redirect()->back();
      }
    }

一个Role中间件:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class Role
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
     public const Admin = '1';
     public const CEO = '2';
     public function handle(Request $request, Closure $next, ... $roles){
         $user = Auth::user();
         
         $role = Auth::user()->role;

         if (!in_array($user->hasRole(), $roles)) {
           return redirect()->back();
        }

        return $next($request);
     }

}

App\Http\Kernel.php

protected $routeMiddleware = [
   ...
   'role' => \App\Http\Middleware\Role::class,
   ...
];

路线:

Route::group(['middleware' => 'auth'], function(){

  Route::group(['middleware' => 'role:Admin,CEO'], function(){

      Route::get('/ceo-panel', [AdminController::class, 'ceo_panel'])->middleware('role:CEO')->name('ceo_panel');

      Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');

  });

});

希望有人会发现这很有用!


推荐阅读