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