身份验证是任何 Web 应用程序的重要组成部分,Laravel 通过其内置的身份验证功能使其易于实现。但是,如果您有多种用户类型,每种类型在数据库中都有自己的表怎么办?在这种情况下,您需要实施多表身份验证以确保正确的用户通过身份验证并获得对应用程序的正确访问权限。在本文中,我将带您完成在 Laravel 中实现多表身份验证的步骤,以便您可以保护您的应用程序并为您的用户提供最佳体验。准备好进入 Laravel 身份验证的世界吧!
我们可以?我们走吧。
我首先假设您知道如何安装一个新的 Laravel 应用程序并且您已经安装了一个。也就是说,让我们继续。
Laravel 带有默认用户表,假设这是您应用程序默认用户的表。并且您想要另一个表供管理员用户使用。
php artisan make:model Admin/Admin
现在您已经创建了 Admin 模型,进入它并复制以下代码。Notifiable 特性使得在这些模型上使用 laravel 默认通知成为可能。
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
class Admin extends Authenticatable
{
use HasFactory, Notifiable;
protected $guard = 'admin';
}
Laravel 有配置文件夹,其中包含所有配置文件。在此文件中,打开 auth.php 文件并将以下代码粘贴到我们为管理员创建身份验证规则的位置。
在 auth.php 配置中
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'admin'=>[
'driver'=>'eloquent',
'model'=>AppModelsAdminAdmin::class,
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'admin'=>[
'driver'=>'session',
'provider'=>'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => AppModelsUser::class,
],
'admins'=>[
'driver'=>'eloquent',
'model'=>AppModelsAdminAdmin::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
'admins'=>[
'driver'=>'eloquent',
'model'=>AppModelsAdminAdmin::class,
],
],
现在导航到 middlware 文件夹并打开 Authentication.php 文件。这是在尝试访问受保护页面时重定向未通过身份验证的用户的文件。请注意,我注释掉了文件中的默认代码。
中间件 Authenticate.php
// foreach ($guards as $guard) {
// if (Auth::guard($guard)->check()) {
// return redirect(RouteServiceProvider::HOME);
// }
// }
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
if($guard === 'admin'){
return redirect()->route('admin.home');
}
return redirect()->route('user.home');
// return redirect(RouteServiceProvider::HOME);
}
}
if (! $request->expectsJson()) {
if($request->routeIs('admin.*')){
return route('admin.login');
}
return route('login');
}
在同一个中间件文件夹中,打开以下文件。它是负责根据身份验证中使用的守卫重定向经过身份验证的用户的中间件。
在 RedirectIfAuthenticated.php 中
// foreach ($guards as $guard) {
// if (Auth::guard($guard)->check()) {
// return redirect(RouteServiceProvider::HOME);
// }
// }
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
if($guard === 'admin'){
return redirect()->route('admin.home');
}
return redirect()->route('user.home');
// return redirect(RouteServiceProvider::HOME);
}
}
Admin auth controller
我们首先创建一个控制器来处理管理员登录。
php artisan make:controller Auth/AdminAuthController
控制器内部
public function __construct()
{
Auth::setDefaultDriver('admin');
config(['auth.defaults.passwords' => 'admins']);
}
public function login()
{
return view('admin_auth.adminlogin');
}
public function store(Request $request)
{
$request->validate([
'email'=>'required|string',
'password'=>'required|min:5|max:30'
]);
if (Auth::guard('admin')->attempt(['email' => $request-
>identifier, 'password' => $request->password])||
Auth::guard('admin')->attempt(['username' => $request>identifier, 'password' => $request->password])) {
// Authentication was successful...
return redirect()->route('panel');
}
else{
return redirect()->route('admin.login')-
>with('fail','Incorrect credentials');
}
}
路由
//身份验证
Route::get('/admin/login', [AdminAuthController::class, 'login'])->name('admin.login');
Route::get('/admin/login', [AdminAuthController::class, 'store'])->name('admin.login.store');
创建第三条路线以通往管理仪表板。
登录 html
Bootstrap demo
工厂和播种机
php artisan make:factory Admin/AdminFactory
php artisan make:seeder AdminSeeder
页面更新:2024-04-23
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号