使用者認證
# laravel使用者認證事實上是指使用者從登入->登入成功的會話維持->退出登入結束會話。
# 主要是由守衛和提供者這兩個方面入手
資料表
CREATE TABLE `admins` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`status` int(11) NOT NULL DEFAULT '1',
`deleted_at` timestamp NULL DEFAULT NULL,
`remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `employees_email_unique` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
<?php
// app\Models\Admin.php(複製User模型)
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class Admin extends Authenticatable
{
use HasFactory, Notifiable;
protected $fillable = [
'name',
'email',
'password',
];
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
}
定義守衛
// config\auth.php
'guards' => [
'admin' => [
// 個人理解為會話的儲存方式
'driver' => 'session',
// 提供者(提供需要的操作方式)
'provider' => 'admins',
]
],
定義提供者
// config\auth.php
'providers' => [
'admins' => [
// 操作方式模型
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
重置密碼方式(略)
'passwords' => [
'admins' => [
'provider' => 'admins',
'table' => 'password_resets',
'expire' => 60
]
]
會話的有效時間
// config\auth.php
'password_timeout' => 10800,
實現的流程部分
新增一個使用者(bcrypt(‘123456’))
INSERT INTO admins(name, email,password) VALUES('yaoxs', 'abcdef@qq.com', '$2y$10$nrgOOalJ1lxtkm/CiUMG7uT14GsamVPSlDKS4KwiC9s3xcnAUvyti');
定義一個驗證使用者是否登入的中介軟體
<?php namespace App\Http\Middleware; use Closure; class TestMiddleware { public function handle($request, Closure $next) { // auth() 獲取 Auth 物件,等同於 Auth Facade // guard 自定義看守器 預設為 `web` 這裡是employee // check 判斷當前使用者是否已認證(是否已登入) if (!auth()->guard('admin')->check()) { // 儲存session $request->session()->flash('error', 'You must be an employee to see this page'); // redirect 返回重定向器例項以進行 重定向 // route 根據命名路由算出 URL return redirect(route('loginView')); } return $next($request); } }
註冊路由中介軟體
// H:\laravel\blog\app\Http\Kernel.php protected $routeMiddleware = [ 'test' => \App\Http\Middleware\TestMiddleware::class, ];
建立登入路由
Route::get('/login', function () { $details = [ 'email' => 'abcdef@qq.com', 'password' => '123456' ]; if(auth()->guard('admin')->attempt($details)){ return '登入成功'; } return '登入失敗'; });
建立使用者登入後進入主頁的路由
Route::get('/home', function () { return '登入成功進入主頁'; })->middleware('test')->name('home');
定義驗證不同過的路由
Route::get('/loginView', function(){ return '驗證失敗,請登入'; })->name('loginView');
定義退出登入的路由
Route::get('/logout', function () { // 這裡的返回值是空,不是布林值有點納悶 auth()->guard('admin')->logout(); return '退出登入成功'; });
本作品採用《CC 協議》,轉載必須註明作者和本文連結