Laravel : 多类型用户

Laravel : Multiple type users

我正在开发一个应用程序,我有三种类型的用户(真实场景),该应用程序具有三个区域 Freelancers 和 Lms(学习管理系统)以及两者的管理面板:

目前我没有使用任何类型的多重身份验证功能,每当我在自由职业者部分登录用户并转到 lms 部分时,经过身份验证的用户在那里可用。

因为我只为用户使用一个 table,我有一列 userType(未使用,但用于将来验证)。

我知道几个包,比如 this one。我可以实施,但我没有,我认为可能有更好的方法,Whosebug 社区可以提供一个。

我的问题是如何处理这种情况,最有效和稳健的方法是什么。

最有效和稳健的方法是使用简单的 user_type 列来存储用户类型并创建一些助手。例如,要检查用户是否是管理员,您可以在 User 模型中创建这样的东西:

public function isAdmin()
{
    return auth()->check() && auth()->user()->user_type === 3;
}

这是最简单的方法,但优点很多。这对使用大量关系的应用程序有好处,对速度等方面也有好处。

您要查找的可能不是多重身份验证,而是某些页面上的权限。看看:https://github.com/spatie/laravel-permission

非常简单明了。它甚至可以让您挑选出用户,例如,他们都有管理员级别,但只有一个人可以查看。

我就是这样做的。

我将跳过有关设置身份验证控制器和视图的详细信息。他们非常直接地使用 artisan 控制台搭建脚手架。

我们首先需要在您的 Users table 上添加新字段。如果您只有两个级别(管理员和非管理员),则为 admin 字段。你的情况下的 ENUM 值。

根据您要授予(或不授予)对特定 sections/pages/resources 等的访问权限的字段值,

Artisan 控制台为基本登录生成所有必要的页面、中间件和路由。但是在你完成之后,你将需要第二个中间件来检查不同级别的访问。让我们称之为 CheckAdmin.

  1. 使用以下命令 php artisan make:middleware CheckAdmin。这将在 app\Http\Middleware

  2. 中创建一个具有指定名称的新中间件
  3. 现在在Kernel.php(最后一行代码)中注册中间件。这为我们刚刚创建的中间件 class 提供了一个名称(在本例中为 admin)。

    protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'admin' => \App\Http\Middleware\CheckAdmin::class,
    ];
    
  4. 你的所有检查某些管理员权限的路由都应该使用我们刚刚在 laravel 提供的 auth 工厂中间件之后注册的 admin 中间件.根据您构建 app/website.

  5. 的方式,有两种方法可以做到这一点

一个。不为路由使用资源控制器。

转到您的路线 web.php 文件。并为请求注册 authadmin 中间件。下面是一个例子。

Route::get('/example-admin-only-route', function () { //SOME LOGIC 
})->middleware('auth', 'admin');

乙。使用资源控制器。 (您可能应该尽可能这样做)

在资源控制器的构造函数中。 ExampleController.php 用于我们的 示例 资源。

class ExampleController extends Controller
{

public function __construct()
{
  $this->middleware('auth');
  $this->middleware('admin');
}

...
}
  1. 为您的 CheckAdmin 中间件编写逻辑。

    namespace App\Http\Middleware;
    
    use Closure;
    
    class CheckAdmin
    {
     /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    
     public function handle($request, Closure $next)
     {
        if($request->user()->admin == 'Admin') //or FreeLancers or LMS (or maybe Unicorns)
        {
          return $next($request);
        }
        else
        {
          return redirect("/not-worthy");
        }
    
      }
    }
    

该代码检查管理员权限并让请求通过或对其执行其他操作。在我们的案例中,重定向到不同的端点。但您可能希望用它做更多有创意的事情。

干杯。