模型
如果某個模型類需要用於認證,必須繼承自 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);
參考文檔
官方文檔:https://learnku.com/docs/laravel/5.7/authentication/2269#08b509