1. 程式人生 > >Laravel 登陸認證 訪問指定的 Guard 例項 Admin認證

Laravel 登陸認證 訪問指定的 Guard 例項 Admin認證

使用 Auth 門面的 guard 方法指定想要使用的 guard 例項,這種機制允許你在同一個應用中對不同的認證模型或使用者表實現完全獨立的使用者認證。

一 、配置

該功能可用於為不同表的不同型別使用者(同一個表不同型別使用者理論上也可以)實現隔離式登入提供了方便,我們只要為每張表配置一個獨立的 guard 就可以了。比如我們除了 users 表之外還有一張 admins 表用於存放後臺管理員,要實現管理員的單獨登入,就可以這麼配置 auth.php 配置檔案:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users', // 預設
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],

    'admin' => [
        'driver' => 'session', // 使用者資訊存到session裡
        'provider' => 'admins', // 新增admin provider
    ]
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class, // 這裡對應的是User模型(預設)
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class, // 這裡對應的是Admin模型
    ],
],

auth.php配置完成後,還需要在Admin模型裡修改

<?php

namespace App\Models; // 注意要和自己定義的模型名稱空間一致

use Illuminate\Foundation\Auth\User as Authenticatable; // 注意這裡要和User模型一樣

// 這裡也要和User模型一樣
class Admin extends Authenticatable 
{
  protected $fillable = [
    'name', 'password'
  ];
}

二、重定向未認證使用者

auth 中介軟體判定某個使用者未認證,會返回一個 JSON 401

響應,或者,如果不是 Ajax 請求的話,將使用者重定向到 login 命名路由(也就是登入頁面)

注意:Laravel 預設的重定向路由是‘/home’

可以通過在 app/Exceptions/Handler.php 檔案中定義一個 unauthenticated 方法來改變這一行為:

use Illuminate\Auth\AuthenticationException;

protected function unauthenticated($request, AuthenticationException $exception)
    {
        if (auth()->
guard('admin')->guest()) { if ($request->ajax() || $request->wantsJson()) { return response('Unauthorized.', 401); } else { return redirect()->guest(route('login')); // 這裡指定重定向後的路由 } } }

三、使用

web.php:

Route::group(['middleware' => 'auth:admin'], function(){
  // 這個group裡的路由必須通過我們定義的 auth:admin 進行驗證
}

登入:

public function login(Request $request) {
  $user = $this->validate($request, [
    'name' => 'required|max:50',
    'password' => 'required|min:5',
  ]);    
  if (Auth::guard('admin')->attempt($user)) { // 登陸驗證
    return redirect()->route('admin.index');
  } else {
   session()->flash('danger', '很抱歉,您的使用者名稱和密碼不匹配');
    return redirect()->back()->withInput($request->input());
  } 
}

獲取當前認證使用者:

use Illuminate\Support\Facades\Auth;

// 獲取當前認證使用者...
$user = Auth::guard('admin')->user();

// 獲取當前認證使用者的ID...
$id = Auth::guard('admin')->id();

退出登入:

  Auth::guard('admin')->logout(); // 退出