Blink 提供了一套輕量級的認(rèn)證授權(quán)框架,通過這套框架我們可以更加方便的在我們的應(yīng)用中實(shí)現(xiàn)認(rèn)證與授權(quán)的系列功能。
在 Blink 中,認(rèn)證特性是由 auth
服務(wù)組件來完成的,我們可以通過 auth()
輔助函數(shù)來獲取該服務(wù)的實(shí)例。為了讓auth
服務(wù)知道如何查找一個(gè) 用戶并驗(yàn)證其密碼的正確性,我們首先需要定義一個(gè) User Identity 類來告訴 auth
服務(wù)這些信息:
為了定義一個(gè) User Identity 類,我們需要實(shí)現(xiàn) blink\auth\Authenticatable
接口,下面的例子展示了如何利用靜態(tài)用戶數(shù)據(jù)定義 User Identiry:
namespace app;
class User extends Object implements Authenticatable
{
public static $users = [
['id' => 1, 'name' => 'user1', 'password' => 'user1'],
['id' => 2, 'name' => 'user2', 'password' => 'user2']
];
public $id;
public $name;
public $password;
/**
* 通過用戶的唯一標(biāo)志查找用戶,例如 主鍵、郵箱
*/
public static function findIdentity($id)
{
if (is_numeric($id)) {
$key = 'id';
$value = $id;
} else if (is_array($id) && isset($id['name'])) {
$key = 'name';
$value = $id['name'];
} else {
throw new InvalidParamException("The param: id is invalid");
}
foreach (static::$users as $user) {
if ($user[$key] == $value) {
return new static($user);
}
}
}
/**
* 返回該用戶的 Auth ID,用于存儲到 Session 中唯一標(biāo)志這個(gè)用戶
*/
public function getAuthId()
{
return $this->id;
}
/**
* 檢查用戶的密碼是否與用戶輸入相匹配
*/
public function validatePassword($password)
{
return $this->password === $password;
}
}
User Identity 定義好之后,我們需要配置 auth
服務(wù),設(shè)置 model
屬性告訴 auth
服務(wù) User Identity 是怎樣定義的:
'auth' => [
'class' => 'blink\auth\Auth',
'model' => 'app\User',
],
只要 User Identity 定義并且配置好,我們就可以通過用戶輸入的用戶名和密碼來認(rèn)證用戶了,下面是例子:
$creditials = ['email' => 'foo@bar.com', 'password' => 123];
// 通過給定的用戶名和密碼進(jìn)行用戶認(rèn)證
$user = auth()->attempt($creditials);
// 進(jìn)行用戶認(rèn)證但是不啟用 Session
$user = auth()->once($creditials);
如果采用 auth()->attempt()
來認(rèn)證用戶,auth
服務(wù)會利用 session
服務(wù)來為認(rèn)證的用戶存儲必要的 Session 數(shù)據(jù),所以我們需要配置好 session
服務(wù)以獲取期望的結(jié)果。
授權(quán)是檢查一個(gè)用戶具有足夠權(quán)限做某事的過程,Blink 中,該功能由 blink\http\Request
類實(shí)現(xiàn),下面是一個(gè)簡單的例子:
use blink\core\Object;
use blink\http\Request;
class Controller extends Object
{
public function actionFoo(Request $request)
{
if (!$requst->guest()) {
$user = $requst->user(); // 獲取當(dāng)前授權(quán)成功的用戶
}
}
}
目前,Blink 默認(rèn)采用 X-Session-Id
Http 頭來傳輸 Session Id。當(dāng)然,這也是可以配置的,我們可以通過設(shè)置blink\http\Request
的 sessionKey
屬性來改變這個(gè)行為,關(guān)于如何設(shè)置該屬性,請查看對應(yīng)類實(shí)現(xiàn)的注釋。
更多建議: