我正在开发一个应用程序,我有三种类型的用户(真实场景),该应用程序有三个区域自由职业者和Lms(学习管理系统)和两个管理面板:
目前我没有使用任何类型的多身份验证功能,每当我登录自由职业者部分的用户并且我进入lms部分时,经过身份验证的用户就可以使用。
因为我只为一个用户使用一个表,我有一个列userType
(这是没有使用但有未来的证明)。
我知道像this one这样的几个包。我可以实现,但我没有,并认为可能有更好的方式,stackoverflow
社区可以提供一个。
我的问题是如何处理这种情况,什么是最有效和最强大的方式。
它可能不是你要找的多声道,而是某些页面的权限。看看:https://github.com/spatie/laravel-permission
它非常简单明了。它甚至可以让你挑出用户,例如两者都有管理员级别,但只有一个人可以查看它。
最有效和最健壮的方法是使用简单的user_type
列来存储用户类型并创建一些帮助程序。例如,要检查用户是否是管理员,您可以在User
模型中创建类似的内容:
public function isAdmin()
{
return auth()->check() && auth()->user()->user_type === 3;
}
这是最简单的方法,具有很多优点。它适用于使用大量关系的应用程序,它对速度等有好处。
我就是这样做的。
我将跳过有关设置auth控制器和视图的详细信息。他们使用工匠控制台非常直接的脚手架。
我们需要的第一件事是你的Users
桌上的新领域。如果您只有两个级别(管理员和非管理员),则为admin
字段。您的案例中的ENUM值。
取决于您希望授予(或不授予)某些部分/页面/资源等的该字段中的值。
工匠控制台生成所有必要的页面,中间件,基本登录路线。但是在完成之后,您将需要第二个中间件来检查不同级别的访问。让我们称之为CheckAdmin
。
php artisan make:middleware 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,
];
admin
工厂中间件之后注册的auth
中间件。根据您构建应用程序/网站的方式,有两种方法可以执行此操作。A.不使用路径的资源控制器。
转到您的路线web.php
文件。并注册auth
和admin
中间件以获取请求。一个例子如下。
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');
}
...
}
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");
}
}
}
代码检查管理员权限,并让请求通过或执行其他操作。在我们的案例中,重定向到不同的终点。但是你可能希望用它做更有创意的事情。
干杯。