Laravel:多种类型的用户

问题描述 投票:2回答:3

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

  • Admins =>管理面板的用户,其中包含所有统计信息/数据。
  • 自由职业者部分:自由职业者部分登录/注册
  • Lms部分=>学习管理系统部分的用户登录/注册

目前我没有使用任何类型的多身份验证功能,每当我登录自由职业者部分的用户并且我进入lms部分时,经过身份验证的用户就可以使用。

因为我只为一个用户使用一个表,我有一个列userType(这是没有使用但有未来的证明)。

我知道像this one这样的几个包。我可以实现,但我没有,并认为可能有更好的方式,stackoverflow社区可以提供一个。

我的问题是如何处理这种情况,什么是最有效和最强大的方式。

php laravel scalability laravel-5.4
3个回答
1
投票

它可能不是你要找的多声道,而是某些页面的权限。看看:https://github.com/spatie/laravel-permission

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


1
投票

最有效和最健壮的方法是使用简单的user_type列来存储用户类型并创建一些帮助程序。例如,要检查用户是否是管理员,您可以在User模型中创建类似的内容:

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

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


1
投票

我就是这样做的。

我将跳过有关设置auth控制器和视图的详细信息。他们使用工匠控制台非常直接的脚手架。

我们需要的第一件事是你的Users桌上的新领域。如果您只有两个级别(管理员和非管理员),则为admin字段。您的案例中的ENUM值。

取决于您希望授予(或不授予)某些部分/页面/资源等的该字段中的值。

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

  1. 使用以下命令php artisan make:middleware CheckAdmin。这将在app\Http\Middleware中创建一个具有指定名称的新中间件
  2. 现在在Kernel.php中注册中间件(最后一行代码)。这为中间件类提供了我们刚刚创建的名称(在本例中为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, ];
  3. 检查某些管理员权限的所有路由应该使用我们刚刚在laravel提供的admin工厂中间件之后注册的auth中间件。根据您构建应用程序/网站的方式,有两种方法可以执行此操作。

A.不使用路径的资源控制器。

转到您的路线web.php文件。并注册authadmin中间件以获取请求。一个例子如下。

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

B.使用资源控制器。 (你应该随时可以)

在资源控制器的构造函数中。 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"); } } }

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

干杯。

© www.soinside.com 2019 - 2024. All rights reserved.