# 認證與授權
Blink 提供了一套輕量級的*認證授權框架*,通過這套框架我們可以更加方便的在我們的應用中實現認證與授權的系列功能。
在 Blink 中,認證特性是由?`auth`?服務組件來完成的,我們可以通過?`auth()`?輔助函數來獲取該服務的實例。為了讓`auth`?服務知道如何查找一個 用戶并驗證其密碼的正確性,我們首先需要定義一個 User Identity 類來告訴?`auth`?服務這些信息:
## 定義 User Identity
為了定義一個 User Identity 類,我們需要實現?`blink\auth\Authenticatable`?接口,下面的例子展示了如何利用靜態用戶數據定義 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`?服務,設置?`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 數據,所以我們需要配置好?`session`?服務以獲取期望的結果。
## 用戶授權
授權是檢查一個用戶具有足夠權限做某事的過程,Blink 中,該功能由?`blink\http\Request`?類實現,下面是一個簡單的例子:
~~~
use blink\core\Object;
use blink\http\Request;
class Controller extends Object
{
public function actionFoo(Request $request)
{
if (!$requst->guest()) {
$user = $requst->user(); // 獲取當前授權成功的用戶
}
}
}
~~~
目前,Blink 默認采用?`X-Session-Id`?Http 頭來傳輸 Session Id。當然,這也是可以配置的,我們可以通過設置`blink\http\Request`?的?`sessionKey`?屬性來改變這個行為,關于如何設置該屬性,請查看對應類實現的注釋。