首页 > 解决方案 > 如何在 Laravel 中使用一个用户模型创建单独的登录视图和重定向

问题描述

我一直在尝试弄清楚如何在 Laravel 中为不同类型的用户创建单独的登录视图。我有一个用户模型,然后是角色表和角色用户表。我确实需要让用户选择他们想要登录的方式(即作为顾问、人力资源管理员、员工)。例如,一个用户可以同时拥有员工和人力资源管理员角色。

这是我使用 Laravel 7 所尝试的:

在 AdvisorLoginController 中,我们有:

use AuthenticatesUsers;

/**
 * Where to redirect users after login.
 *
 * @var string
 */
protected $redirectTo = RouteServiceProvider::HOME;

“受保护的 $redirectTo = RouteServiceProvider::HOME;” 部分相对简单,因为我可以修改它以在登录后转到顾问仪表板。

但是 AuthenticatedUsers 特性带来了一个问题。我掉进了这个兔子洞,出不来了。我试图从 Laravel/UI 包中复制 AuthenticateUsers 文件并创建一个 AuthenticateAdvisors 特征,但这变得一团糟。

我在这里错过了一个简单的解决方法吗?

标签: laravel

解决方案


可以通过提供多个保护来完成,例如,一个保护管理员,另一个保护用户或客户,然后您应该在不同的命名空间中创建一个单独的登录控制器(建议在不同的命名空间中)。

首先,为每个在 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!
       });
  });

推荐阅读