我正在开发一个应用程序,其中我有三种类型的用户(真实场景),该应用程序具有三个区域自由职业者和 Lms(学习管理系统)以及两个区域的管理面板:
- 管理员 => 管理面板的用户,所有统计数据/数据都在那里。
- 自由职业者部分:自由职业者部分登录/注册
- Lms 部分 => 学习管理系统部分的用户登录/注册
目前我没有使用任何类型的多重身份验证功能,每当我在自由职业者部分中以用户身份登录并进入 lms 部分时,经过身份验证的用户都可以在那里使用。
因为我只为用户使用一张表,其中有一列userType
(该列未使用,但用于将来校对)。
我知道几个包,例如 this one 。我可以实现,但我还没有,并且认为可能有更好的方法,stackoverflow
社区可以提供一个。
我的问题是如何处理这种情况,什么是最有效和最稳健的方法。
最佳答案
我就是这样做的。
我将跳过有关设置身份验证 Controller 和 View 的详细信息。使用 artisan 控制台,他们可以非常直接地搭建脚手架。
我们首先需要的是您的Users
表中的新字段。如果您只有两个级别(管理员和非管理员),则需要一个admin
字段。您的情况中的 ENUM 值。
根据该字段中的值,您想要授予(或不授予)对某些部分/页面/资源等的访问权限。
Artisan 控制台生成基本登录所需的所有页面、中间件、路由。但完成此操作后,您将需要第二个中间件来检查不同级别的访问权限。我们称之为 CheckAdmin
。
使用以下命令
php artisan make:中间件CheckAdmin
。这将在app\Http\Middleware
中创建一个具有指定名称的新中间件
现在在
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, ];
检查某些管理员权限的所有路由都应该使用我们刚刚在 Laravel 提供的
auth
工厂中间件之后注册的admin
中间件。有两种方法可以实现此目的,具体取决于您构建应用程序/网站的方式。
A.不使用路由资源 Controller 。
转到您的路由 web.php
文件。并为请求注册 auth
和 admin
中间件。下面是一个示例。
Route::get('/example-admin-only-route', function () { //SOME LOGIC
})->middleware('auth', 'admin');
B.使用资源 Controller 。 (只要有可能,您可能就应该这么做)
在资源 Controller 的构造函数中。 ExampleController.php
用于我们的示例资源。
class ExampleController extends Controller
{
public function __construct()
{
$this->middleware('auth');
$this->middleware('admin');
}
...
}
为您的
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"); } } }
代码会检查管理员权限,然后要么让请求通过,要么对其执行其他操作。在我们的例子中,重定向到不同的端点。但您可能希望用它做更多有创意的事情。
干杯。
关于php - 拉拉维尔 : Multiple type users,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43053834/