身份验证是任何Web应用程序的重要组成部分,Laravel可以轻松使用其内置身份验证功能实现。但是,如果您有多种用户类型,每个用户类型在数据库中都有自己的表格怎么办?在这种情况下,您需要实现多桌身份验证,以确保对正确的用户进行身份验证并允许正确访问该应用程序。在本文中,我将引导您完成Laravel中实施多桌身份验证的步骤,以便您可以保护应用程序并为用户提供最佳体验。准备潜入Laravel身份验证的世界!
我们吗?我们走吧。
我开始假设您知道如何安装新的Laravel应用程序,并且已经安装了一个应用程序。就是说,让我们继续。
Laravel随附默认用户表,假设这是应用程序默认用户的表。您想要另一个用于管理用户的表。
楷模)
首先,我们为此CAS Admins中的新用户创建模型。在您的情况下,可能是老师和学生。
php artisan make:model Admin/Admin
现在,您已经创建了管理模型,将其放入并复制以下代码。值得通知的特征使在这些模型上使用Laravel默认通知是可能的。
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Admin extends Authenticatable
{
use HasFactory, Notifiable;
protected $guard = 'admin';
}
配置
Laravel具有包含所有配置文件的配置文件夹。在此文件中,打开auth.php文件并粘贴以下代码,我们在其中为管理员创建身份验证规则
在auth.php config
中
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'admin'=>[
'driver'=>'eloquent',
'model'=>App\Models\Admin\Admin::class,
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
'admin'=>[
'driver'=>'session',
'provider'=>'admins',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins'=>[
'driver'=>'eloquent',
'model'=>App\Models\Admin\Admin::class,
],
],
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
'admins'=>[
'driver'=>'eloquent',
'model'=>App\Models\Admin\Admin::class,
],
],
中间件
现在导航到Middlware文件夹并打开authentication.php文件。这是重定向用户尝试访问守卫页面时未经身份验证的文件。请注意,我在文件中评论了默认代码。
middelware 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 logoutAdmin(Request $request)
{
Auth::guard('admin')->logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect('/');
}
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');
Route::post('/admin/logout', [AdminAuthController::class, 'logoutAdmin'])->name('admin.logout');
注意这部分。您将需要更多通向仪表板或任何其他受保护页面的路线。 下面是这种路线的Exampme。注意中间软件使用情况验证:管理员。非常重要。
Route::get('/panel', [AdminPagesController::class, 'panel_home'])->name('panel')->middleware('auth:admin');
登录HTML
此时,让我们创建blade文件或html文件以登录管理登录页面。资源\ views \ admin_auth.blade.php
请注意我们将此表格提交给的位置。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
<!-- <h1>Hello, world!</h1> -->
<main class="container mt-5">
<form method="POST" action="{{route('admin.login.store')}}">
@csrf
<div class="form-group">
<h3 class="text-center">Admin Login</h3>
</div>
<div class="mb-3">
<label for="exampleInputEmail1" class="form-label">Email or Username</label>
<input type="text" class="form-control" name="identifier" id="exampleInputEmail1" aria-describedby="emailHelp">
<div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
</div>
<div class="mb-3">
<label for="exampleInputPassword1" class="form-label">Password</label>
<input type="password" name="password" class="form-control" id="exampleInputPassword1">
</div>
<div class="mb-3 form-check">
<input type="checkbox" name="remember" class="form-check-input" id="exampleCheck1">
<label class="form-check-label" for="exampleCheck1">Check me out</label>
</div>
<button type="submit" style="float:right;" class="btn btn-primary">Submit</button>
</form>
</main>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
</body>
</html>
移民
现在让我们为此新用户创建表或迁移-Admins。运行命令
php artisan make:migration create_admins_table
在迁移文件中,复制并粘贴下面的代码
$table->string('name');
$table->string('username')->nullable();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
// $table->enum('admin_typ', ['admin'])->nullable();
$table->rememberToken();
工厂和播种机
现在让我们快速填充数据库。我们首先为管理员模型和播种机文件制作模型工厂。
php artisan make:factory Admin/AdminFactory
php artisan make:seeder AdminSeeder
在工厂定义方法中
return [
'name' => fake()->name(),
'username'=>fake()->userName(),
'email' => fake()->unique()->safeEmail(),
'email_verified_at' => now(),
'password'=>'$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
在播种机文件中,在运行方法中
\App\Models\Admin\Admin::factory(5)->create();
\App\Models\Admin\Admin::factory()->create([
'name' => 'Test Admin',
'username'=>'admin',
'email' => 'admin@admin.com',
]);
接下来运行播种机命令以填充数据库。
php artisan db:seed --class=AdminSeeder
记住为受保护的页面创建HTML刀片。
就是这样。启动您的Laravel应用程序,然后尝试在管理员登录页面上登录。
我是Vincent Ikechukwu,完整的堆栈Web开发人员和软件工程师。通过下面的链接在社交媒体上与我联系。
如果您遇到麻烦,请发表评论或在我的社交媒体上打招呼。