W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
認(rèn)證可以用與緩存和 session 功能相同的方法擴(kuò)展。再一次的,使用我們已經(jīng)熟悉的 extend 方法:
Auth::extend('riak', function($app)
{
// 返回 Illuminate\Contracts\Auth\UserProvider 的實(shí)現(xiàn)
});
UserProvider 實(shí)現(xiàn)只負(fù)責(zé)從永久存儲(chǔ)系統(tǒng)抓取 Illuminate\Contracts\Auth\Authenticatable 實(shí)現(xiàn),存儲(chǔ)系統(tǒng)例如: MySQL 、 Riak ,等等。這兩個(gè)接口讓 Laravel 認(rèn)證機(jī)制無論用戶數(shù)據(jù)如何保存或用什么種類的類來代表它都能繼續(xù)運(yùn)作。
讓我們來看一下 UserProvider contract :
interface UserProvider {
public function retrieveById($identifier);
public function retrieveByToken($identifier, $token);
public function updateRememberToken(Authenticatable $user, $token);
public function retrieveByCredentials(array $credentials);
public function validateCredentials(Authenticatable $user, array $credentials);
}
retrieveById 函數(shù)通常接收一個(gè)代表用戶的數(shù)字鍵,例如:MySQL 數(shù)據(jù)庫的自動(dòng)遞增 ID。這方法應(yīng)該取得符合 ID 的 Authenticatable 實(shí)現(xiàn)并返回。
retrieveByToken 函數(shù)用用戶唯一的 $identifier 和保存在 remember_token 字段的「記住我」 $token 來取得用戶。跟前面的方法一樣,應(yīng)該返回 Authenticatable 的實(shí)現(xiàn)。
updateRememberToken 方法用新的 $token 更新 $user 的 remember_token 字段。新 token 可以是在「記住我」成功地登錄時(shí),傳入一個(gè)新的 token,或當(dāng)用戶注銷時(shí)傳入一個(gè) null。
retrieveByCredentials 方法接收當(dāng)嘗試登錄應(yīng)用程序時(shí),傳遞到 Auth::attempt 方法的憑證數(shù)組。這個(gè)方法應(yīng)該接著「查找」底層使用的永久存儲(chǔ),找到符合憑證的用戶。這個(gè)方法通常會(huì)對(duì) $credentials['username'] 用「 where 」條件查找。 并且應(yīng)該返回一個(gè) UserInterface 接口的實(shí)現(xiàn)。這個(gè)方法不應(yīng)該嘗試做任何密碼驗(yàn)證或認(rèn)證。
validateCredentials 方法應(yīng)該通過比較給定的 $user 與 $credentials 來驗(yàn)證用戶。舉例來說,這個(gè)方法可以比較 $user->getAuthPassword() 字串跟 Hash::make 后的 $credentials['password']。這個(gè)方法應(yīng)該只驗(yàn)證用戶的憑證數(shù)組并且返回布爾值。
現(xiàn)在我們已經(jīng)看過 UserProvider 的每個(gè)方法,接著來看一下 Authenticatable。記住,提供者應(yīng)該從 retrieveById 和 retrieveByCredentials 方法返回這個(gè)接口的實(shí)現(xiàn):
interface Authenticatable {
public function getAuthIdentifier();
public function getAuthPassword();
public function getRememberToken();
public function setRememberToken($value);
public function getRememberTokenName();
}
這個(gè)接口很簡單。 The getAuthIdentifier 方法應(yīng)該返回用戶的「主鍵」。在 MySQL 后臺(tái),同樣,這將會(huì)是個(gè)自動(dòng)遞增的主鍵。getAuthPassword 應(yīng)該返回用戶哈希過的密碼。這個(gè)接口讓認(rèn)證系統(tǒng)可以與任何用戶類一起運(yùn)作,無論你使用什么 ORM 或保存抽象層。默認(rèn),Laravel 包含一個(gè)實(shí)現(xiàn)這個(gè)接口的 User 類在 app 文件夾里,所以你可以參考這個(gè)類當(dāng)作實(shí)現(xiàn)的例子。
最后,當(dāng)我們已經(jīng)實(shí)現(xiàn)了 UserProvider,我們準(zhǔn)備好用 Auth facade 來注冊(cè)擴(kuò)展:
Auth::extend('riak', function($app)
{
return new RiakUserProvider($app['riak.connection']);
});
用 extend 方法注冊(cè)驅(qū)動(dòng)之后,在你的 config/auth.php 配置文件切換到新驅(qū)動(dòng)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: