1. 程式人生 > >【laravel】用戶認證之----手動認證用戶

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

註釋 app 查詢 不可用 api 功能 other spa ted

模型

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

<?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操作。如果這兩個哈希密碼匹配,就會為用戶開啟一個已認證的會話。

如果認證成功那麽 attempt 方法將返回 true。反之,會返回 false

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

記住用戶

如果想在應用中提供「記住我」的功能 ,你可以給 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基類。

Auth::login($user);

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

通過 ID 驗證用戶

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

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);

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