【laravel】用戶認證之----手動認證用戶

模型

若是某個模型類須要用於認證,必須繼承自 Illuminate\Foundation\Auth\User 基類,不然會報錯。而後在這個模型類中使用 Notifiable Trait,裏面提供了用戶發送通知的相關方法。配置 $hidden 屬性,在返回查詢結果的時候將敏感信息過濾掉,避免安全隱患。
php

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User;
use Illuminate\Notifications\Notifiable;

class Manager extends User
{
    use Notifiable;

    protected $hidden = ['password', 'remember_token'];
}

手動認證:attempt

public function login(Request $request)
{
    $rs = \Auth::guard('admin')->attempt($request->only(['email', 'password']));
    if ($rs) {
        return redirect()->intended('dashboard');
    }
}

attempt 方法接受一個鍵值對數組做爲其第一個參數。數組中的值將被用於在數據表中查找用戶。因此,在上例中,用戶將經過 email 字段的值進行檢索。若是找到了這個用戶,數據庫中保存的哈希密碼將被用來與傳遞給方法的數組中 password 的哈希值進行比較。你不該該將指定爲密碼的 password 的值進行哈希操做,由於框架將在比較前,自動對其進行hash操做。若是這兩個哈希密碼匹配,就會爲用戶開啓一個已認證的會話。html

若是認證成功那麼 attempt 方法將返回 true。反之,會返回 false 。laravel

重定向器上的 intended 方法將重定向用戶到他們曾經但願訪問的 URL,這個 URL 以前被用戶認證中間件攔截了。能夠給這個方法傳遞一個回退 URI,用於預期的地址不可用的狀況。web

記住用戶

若是想在應用中提供「記住我」的功能 ,你能夠給 attempt 方法的第二個參數傳入一個布爾值,這將永久保持用戶的認證狀態,或者直到他們手動註銷登陸。固然,你的用戶表必須包含名爲 remember_token 的字符串字段,它將被用於保存「記住我」的令牌。數據庫

if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    // 這個用戶被記住了...
}

若是你啓用了「記住」用戶,你可使用 viaRemember 方法肯定用戶是否正使用「記住我」的cookie令牌進行的認證 數組

if (Auth::viaRemember()) {
    //
}

註銷登陸

要將用戶從應用中註銷,你可使用 Auth 門面上的 logout 方法。這將清除用戶會話中的認證信息:安全

Auth::logout();

其它認證方式

經過用戶實例登入應用

若是你須要把現存的用戶實例登入應用, 你能夠調用 login 方法並附帶用戶實例做爲參數。給定的這個對象必須實現 Illuminate\Contracts\Auth\Authenticatable 契約,或者繼承自Illuminate\Foundation\Auth\User基類。cookie

Auth::login($user);

// 登陸而且「記住」給定的用戶...
Auth::login($user, true);

經過 ID 驗證用戶

要使用用戶的 ID 登陸應用,你可使用 loginUsingId 方法。這個方法接受須要認證的用戶主鍵:app

Auth::loginUsingId(1);

// 登陸而且「記住」給定的用戶...
Auth::loginUsingId(1, true);

僅驗證用戶一次

你能夠在單次請求中使用 once 方法將用戶登陸到應用中。這將不會使用任何 Session 或者 Cookie,這意味着在構建無狀態API時,此方法可能會有所幫助:框架

if (Auth::once($credentials)) {
    //
}

讓其它設備上的 Session 失效

Laravel 還提供了一種機制,用於將其它設備上的用戶 Session 失效和「註銷」,而不會使其當前設備上的 Session 失效。首先,你須要保證Illuminate\Session\Middleware\AuthenticateSession 中間件在你的app/Http/Kernel.php類中的 web 中間件組中,而且沒有被註釋掉:

'web' => [
    // ...
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    // ...
],

而後, 你就可使用 Auth 門面上的 logoutOtherDevices 方法。此方法要求用戶提供其當前密碼,你的應用程序應經過輸入表單接受該密碼:

use Illuminate\Support\Facades\Auth;

Auth::logoutOtherDevices($password);

 參考文檔

官方文檔:https://learnku.com/docs/laravel/5.7/authentication/2269#08b509

laravel學院:https://laravelacademy.org/post/9733.html

相關文章
相關標籤/搜索