Laravel —— 多套用户登录


Laravel 自带了用户认证 Auth。有看守器和提供器来实现。

对于前后台都需要登录的系统,需要添加一套用户认证。

本文中使用 Laravel 9。

一、生成自带的用户认证

php artisan ui:auth

1、执行脚手架命令后生成下面的代码

  - app/Http/Controllers/Auth/   相关控制器

  - resources/views/auth/    相关页面

  - routes/web.php     路由中追加了 Auth 系列

2、对应用户表 users,

3、加上 config/auth.php 配置文件中设置的 guards、providers,即可实现登录注册、邮箱验证、修改密码等操作。

二、生成新用户表 members

  创建 migration,生成自定义表

三、修改配置文件

1、在 config/auth.php 文件中,providers 数组中添加,

        'members' => [
            'driver' => 'eloquent',
            'model' => App\Models\Member::class,
        ],

2、guards 数组中添加

        'front' => [
            'driver' => 'session',
            'provider' => 'members',
        ],

四、重写登录注册方法

底层文件再 vendor/laravel/ui/auth-backend/ 目录,

继承相应的控制器,并根据需求重写方法。

1、重写登录控制器方法

// 修改成上面自定义的看守器
    protected function guard()
    {
        return Auth::guard(‘front’);
    }

// 修改登录表单用户名
    public function username()
    {
        return 'account';
    }

// 修改实现多类型账号登录
    protected function attemptLogin(Request $request)
    {
        return collect(['mail', 'tel', 'name'])->contains(function ($value) use ($request) {
            $account = $request->get($this->username());
            $password = $request->get('password');

            return $this->guard()->attempt(
                [$value => $account, 'password' => $password], $request->filled('remember')
            );
        });
    }

2、其他控制器,按照需求重写即可。

五、给路由添加登录验证

1、新建中间件文件 

 php artisan make:middleware AuthMember

// 修改文件中的 handle 方法
    public function handle(Request $request, Closure $next)     {         if (\Auth::guard('front')->guest()) {             if ($request->ajax() || $request->wantsJson()) {                 return response('Unauthorized.', 401);             } else {                 return redirect()->guest('login');             }         }
        return $next($request);     }

2、把新建的路由,添加在 app/Http/Kernel.php 文件中

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        ...
        ...
        
        'auth.member' => \App\Http\Middleware\AuthMember::class,
    ];

3、路由中添加中间件

Route::prefix('/')->middleware('auth.member')->group(function(){
    Route::get('/', [IndexController::class, 'index'])->name('home');
});