laravel使用者認證

yaoxs 發表於 2021-03-28
Laravel

使用者認證

# 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', 'abcd[email protected]', '$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' => '[email protected]',
        '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 協議》,轉載必須註明作者和本文連結