1. 程式人生 > >Laravel5.3使用auth登入驗證

Laravel5.3使用auth登入驗證

1.使用命令列直接設定

想要更快上手?只需要在新安裝的Laravel應用下執行php artisan make:auth ,然後在瀏覽器中訪問http://my/register ,該命令會生成使用者登入註冊所需要的所有東西。

Laravel 提供了幾個預置的認證控制器,位於 App\Http\Controllers\Auth 名稱空間下,RegisterController 用於處理新使用者註冊,

LoginController 用於處理使用者登入認證,ForgotPasswordController 用於處理重置密碼郵件連結,

ResetPasswordController 包含重置密碼邏輯,每個控制器都使用 trait 來引入它們需要的方法。對很多應用而言,你根本不需要修改這些控制器。

路由

Laravel 通過執行如下命令可快速生成認證所需要的路由和檢視:

php artisan make:auth

執行該命令會生成註冊和登入檢視,以及所有的認證路由,同時生成 HomeController 用於處理應用的登入請求。

檢視

正如上面所提到的,php artisan make:auth 命令會在 resources/views/auth 目錄下建立所有認證需要的檢視。

make:auth 命令還建立了 resources/views/layouts 目錄,該目錄下包含了應用的基礎佈局檔案。所有這些檢視都使用了 Bootstrap CSS 框架,

你也可以根據需要對其進行自定義。

如圖:

認證

現在你已經為自帶的認證控制器設定好了路由和檢視,接下來我們來實現新使用者註冊和登入認證。你可以在瀏覽器中訪問定義好的路由,

認證控制器預設已經包含了註冊及登入邏輯(通過trait)。

自定義路徑

當一個使用者成功進行登入認證後,預設將會跳轉到/home,你可以通過在LoginControllerRegisterControllerResetPasswordController

中定義 redirectTo屬性來自定義登入認證成功之後的跳轉路徑:

protected $redirectTo = '/';

當一個使用者登入認證失敗後,預設將會跳轉回登入表單對應的頁面。

自定義Guard

你還可以自定義用於實現使用者註冊登入的“guard”,要實現這一功能,需要在 LoginControllerRegisterControllerResetPasswordController

中定義 guard 方法,該方法將會返回一個guard例項:

use Illuminate\Support\Facades\Auth;

protected function guard()
{
    return Auth::guard('guard-name');
}

自定義驗證/儲存

要修改新使用者註冊所必需的表單欄位,或者自定義新使用者欄位如何儲存到資料庫,你可以修改 RegisterController 類。該類負責為應用驗證輸入引數和建立新使用者。

RegisterController  的 validator 方法包含了新使用者註冊的驗證規則,你可以按需要自定義該方法。

RegisterController  的 create 方法負責使用 Eloquent ORM 在資料庫中建立新的 App\User 記錄。當然,你也可以基於自己的需要自定義該方法.

獲取認證使用者

你可以通過 Auth 門面訪問認證使用者:

$user = Auth::user();

2.手動認證使用者

當然,你也可以不使用 Laravel 自帶的認證控制器。如果你選擇移除這些控制器,你需要直接使用 Laravel 認證類來管理使用者認證。別擔心,這很簡單!

我們將會通過 Auth 門面來訪問認證服務,因此我們需要確保在類的頂部匯入了 Auth 門面,讓我們看看 attempt方法:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    /**
     * Handle an authentication attempt.
     *
     * @return Response
     */
    public function authenticate()
    {
        if (Auth::attempt(['email' => $email, 'password' => $password])) {
            // Authentication passed...
            return redirect()->intended('dashboard');
        }
    }
}

attempt 方法接收鍵值陣列對作為第一個引數,陣列中的值被用於從資料表中查詢使用者,因此,在上面的例子中,使用者將會通過email 的值獲取,如果使用者被找到,

經雜湊運算後儲存在資料中的密碼將會和傳遞過來的經雜湊運算處理的密碼值進行比較。如果兩個經雜湊運算的密碼相匹配那麼將會為這個使用者開啟一個認證Session。

如果認證成功的話 attempt 方法將會返回 true。否則,返回 false

重定向器上的 intended 方法將使用者重定向到登入之前使用者想要訪問的 URL,在目標 URL 無效的情況下回退 URI 將會傳遞給該方法。

指定額外條件

如果需要的話,除了使用者郵件和密碼之外還可以在認證查詢時新增額外的條件,例如,我們可以驗證被標記為有效的使用者:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
    // The user is active, not suspended, and exists.
}

注:在這些例子中,並不僅僅限於使用 email 進行登入認證,這裡只是作為演示示例,你可以將其修改為資料庫中任何其他可用作“username”的欄位。

訪問指定 Guard 例項

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

傳遞給 guard 方法的 guard 名稱對應配置檔案 auth.php 中 guards 配置的某個鍵:

if (Auth::guard('admin')->attempt($credentials)) {
    //
}

自定義的Guard

在配置檔案 config/auth.php 中切換到新的使用者提供者。首先,定義一個使用新驅動的 provider

'providers' => [
    'users' => [
        'driver' => 'riak',
    ],
],

然後,可以在你的 guards 配置中使用這個提供者:

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

在這裡我使用的是資料庫裡的使用者,這樣就指定使用者提供者了。

資料表結構:

CREATE TABLE `admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '0' COMMENT '登入名',
  `password` varchar(80) NOT NULL DEFAULT '0' COMMENT '登入密碼',
  `remember_token` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  `addtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '新增時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COMMENT='後臺管理員';

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'admin',
        ],
    ],
'providers' => [
        'admin' => [
            'driver' => 'database',
            'table' => 'admin',
        ],

退出

要退出應用,可以使用 Auth 門面的 logout 方法,這將會清除使用者 Session 中的認證資訊:

Auth::logout();