Laravel : 多类型用户
Laravel : Multiple type users
我正在开发一个应用程序,我有三种类型的用户(真实场景),该应用程序具有三个区域 Freelancers 和 Lms(学习管理系统)以及两者的管理面板:
- 管理员 => 管理面板的用户,所有 statistics/data 都在那里。
- 自由职业者部分:自由职业者部分signin/signup
- lms版块=>学习管理系统版块的用户signin/signup
目前我没有使用任何类型的多重身份验证功能,每当我在自由职业者部分登录用户并转到 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
.
使用以下命令
php artisan make:middleware CheckAdmin
。这将在 app\Http\Middleware
中创建一个具有指定名称的新中间件
现在在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,
];
你的所有检查某些管理员权限的路由都应该使用我们刚刚在 laravel 提供的 auth
工厂中间件之后注册的 admin
中间件.根据您构建 app/website.
的方式,有两种方法可以做到这一点
一个。不为路由使用资源控制器。
转到您的路线 web.php
文件。并为请求注册 auth
和 admin
中间件。下面是一个例子。
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');
}
...
}
为您的 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");
}
}
}
该代码检查管理员权限并让请求通过或对其执行其他操作。在我们的案例中,重定向到不同的端点。但您可能希望用它做更多有创意的事情。
干杯。
我正在开发一个应用程序,我有三种类型的用户(真实场景),该应用程序具有三个区域 Freelancers 和 Lms(学习管理系统)以及两者的管理面板:
- 管理员 => 管理面板的用户,所有 statistics/data 都在那里。
- 自由职业者部分:自由职业者部分signin/signup
- lms版块=>学习管理系统版块的用户signin/signup
目前我没有使用任何类型的多重身份验证功能,每当我在自由职业者部分登录用户并转到 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
.
使用以下命令
php artisan make:middleware CheckAdmin
。这将在app\Http\Middleware
中创建一个具有指定名称的新中间件
现在在
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, ];
你的所有检查某些管理员权限的路由都应该使用我们刚刚在 laravel 提供的
auth
工厂中间件之后注册的admin
中间件.根据您构建 app/website. 的方式,有两种方法可以做到这一点
一个。不为路由使用资源控制器。
转到您的路线 web.php
文件。并为请求注册 auth
和 admin
中间件。下面是一个例子。
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');
}
...
}
为您的
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"); } } }
该代码检查管理员权限并让请求通过或对其执行其他操作。在我们的案例中,重定向到不同的端点。但您可能希望用它做更多有创意的事情。
干杯。