我一直在努力找出如何在Laravel中为不同类型的用户创建单独的登录视图。我有一个用户模型,然后是角色表和角色用户表。我确实需要让用户选择他们想要登录的方式(即作为顾问、人力资源管理员、员工(。例如,一个用户可以同时具有"员工"one_answers"人力资源管理员"角色。
以下是我尝试的,使用Laravel 7:
- 安装Auth脚手架
- 通过复制基本Laravel Auth附带的登录视图来创建名为advisor login的视图
- 通过复制基本Laravel Auth附带的LoginController创建AdvisorLoginControll
- 创建指向AdvisorLoginController的顾问登录路径。更新advisor登录视图中的操作以转到此路线
在AdvisorLoginController中,我们有:
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
";protected$redirectTo=RouteServiceProvider::HOME"部分相对简单,因为我可以在登录后修改它以转到Advisor Dashboard
但是AuthenticatedUsers特性带来了一个问题。我掉进了兔子洞,出不去了。我试图用Laravel/UI包复制AuthenticateUsers文件,并创建AuthenticateAdvisors特性,但这变得一团糟。
我是不是错过了一个简单的解决方案?
这可以通过提供多个保护来完成,例如,一个保护用于管理员,另一个保护用户或客户。然后,您应该在不同的命名空间中创建一个单独的登录控制器(建议在不同的名称空间中(。
首先,在config/auth.php中为每个创建一个不同的保护程序,如下所示(您可能想在保护程序中使用不同的驱动程序(
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admins' => [
'driver' => 'passport',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
您应该通过为不同的用户类型提供名称空间来对路由进行分组
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function () {
//your route goes here!
});
通过对路由进行分组,您可以拥有多个登录表单。为了验证不同的用户类型,您可以为每种类型创建不同的中间件,例如admin和
<?php
namespace AppHttpMiddleware;
use Closure;
class Admin
{
/**
* Handle an incoming request.
*
* @param IlluminateHttpRequest $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!auth()->user()->isAdmin()) {
return response()->json(['message' => 'You have no rights'], 403);
}
return $next($request);
}
}
然后将管理中间件添加到路由中,以验证角色和其他内容。像低于
Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function () {
//your route goes here!
Route::group(['prefix' => 'dashboard', 'middleware' => ['auth','admin']], function () {
//your route goes here!
});
});
在我看来,想要为每个用户配置文件创建一个特定的登录页面并不是很理想。可以只有一个页面,但是对功能的访问由ACL管理。可能有一个管理区域,您可以在其中定义和分配角色