如何在Laravel中使用一个用户模型创建单独的登录视图和重定向



我一直在努力找出如何在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管理。可能有一个管理区域,您可以在其中定义和分配角色

最新更新