laravel - 如何在 Laravel 中使用一个用户模型创建单独的登录视图和重定向
问题描述
我一直在尝试弄清楚如何在 Laravel 中为不同类型的用户创建单独的登录视图。我有一个用户模型,然后是角色表和角色用户表。我确实需要让用户选择他们想要登录的方式(即作为顾问、人力资源管理员、员工)。例如,一个用户可以同时拥有员工和人力资源管理员角色。
这是我使用 Laravel 7 所尝试的:
- 安装 Auth 脚手架
- 通过复制基本 Laravel Auth 附带的登录视图来创建名为 advisor-login 的视图
- 通过复制基本 Laravel Auth 附带的 LoginController 创建 AdvisorLoginController
- 创建指向 AdvisorLoginController 的顾问登录路由。更新 advisor-login 视图中的操作以转到此路由
在 AdvisorLoginController 中,我们有:
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
“受保护的 $redirectTo = RouteServiceProvider::HOME;” 部分相对简单,因为我可以修改它以在登录后转到顾问仪表板。
但是 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 App\Http\Middleware;
use Closure;
class Admin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $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!
});
});
推荐阅读
- html - 具有动态高度元素的响应式高度布局
- java - 对单词进行排序以在 Java 中进行 Web 输出
- visual-studio - Visual Studio 2017 可以在不迁移到 2.0 的情况下运行 .Net Core 1.x 项目吗?
- python - Python 和矩阵,移动列和行
- vba - 正确使用布尔值/大小写?
- ios - 使用 1 个 NSFetchedResultsController 具有不同顺序的多个部分
- css - 通过它的中点定位一个可变宽度的 div
- java - 使用@Qualifier 我仍然得到 UnsatisfiedDependency 异常,任何人都可以帮我解决这个问题
- java - 在Java中获取带有国家代码的地区时区
- ruby-on-rails - Linux 上的 Rails 控制台总是在每一行的末尾显示 \r