如何使用Hyperf框架進行介面鑑權
鑑權是Web應用程式開發中一個重要的安全性問題,它可以保護我們的介面不被未授權的使用者存取。在使用Hyperf框架開發介面時,我們可以利用Hyperf提供的鑑權機制來實作介面鑑權。本文將介紹如何使用Hyperf框架進行介面鑑權,並提供具體的程式碼範例。
一、理解介面鑑權
介面鑑權是透過驗證使用者的身份訊息,確定使用者是否有權存取介面的過程。常見的鑑權方式有基於Token的鑑權和基於角色的鑑權。
基於Token的鑑權是透過在使用者登入後頒發一個Token,在每次請求介面時,使用者需要在請求的頭部中攜帶該Token,服務端驗證該Token的有效性,確定使用者身分是否合法。
基於角色的鑑權是透過為使用者指派不同的角色和權限,當使用者要求介面時,服務端會根據使用者的角色來驗證其是否有權存取該介面。
二、設定Hyperf框架介面鑑權
Hyperf框架提供了Hyperf/Jwt元件來支援介面鑑權,我們首先需要在專案中安裝該元件。在專案根目錄下執行以下命令:
composer require hyperf/jwt
Hyperf框架中間件可以實現在請求到達控制器之前或之後進行一些處理。我們可以透過配置中間件來實現介面鑑權。
在config/autoload/middleware.php檔案中加入以下程式碼:
return [ 'http' => [ AppMiddlewareJwtAuthMiddleware::class, ], ];
在app/Middleware目錄下建立JwtAuthMiddleware .php文件,寫如下程式碼:
<?php declare(strict_types=1); namespace AppMiddleware; use HyperfDiAnnotationInject; use HyperfHttpServerContractRequestInterface; use HyperfHttpServerContractResponseInterface; use HyperfUtilsContext; use HyperfUtilsExceptionParallelExecutionException; use Phper666JwtAuthJwt; class JwtAuthMiddleware implements MiddlewareInterface { /** * @Inject * @var Jwt */ protected $jwt; /** * @Inject * @var RequestInterface */ protected $request; /** * @Inject * @var ResponseInterface */ protected $response; /** * 接口鉴权逻辑处理 */ public function process(RequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { if (!$this->jwt->checkToken()) { return $this->response->json([ 'code' => 401, 'message' => 'Unauthorized', ]); } // 鉴权通过,将用户信息保存在Context中,后续控制器可通过Context获取用户信息 Context::set('user', $this->jwt->getParserData()); return $handler->handle($request); } }
三、使用Hyperf進行介面鑑權
<?php declare(strict_types=1); namespace AppController; use HyperfHttpServerAnnotationAutoController; use HyperfDiAnnotationInject; use Phper666JwtAuthJwt; /** * @AutoController */ class AuthController { /** * @Inject * @var Jwt */ protected $jwt; public function login() { // 获取用户信息 $userInfo = [ 'user_id' => 1, 'username' => 'admin', ]; // 生成Token $token = $this->jwt->getToken($userInfo); // 返回Token给前端 return [ 'code' => 200, 'message' => 'success', 'data' => [ 'token' => $token, ], ]; } }
<?php declare(strict_types=1); namespace AppController; use HyperfHttpServerAnnotationAutoController; use HyperfDiAnnotationInject; use HyperfUtilsContext; /** * @AutoController */ class UserController { public function getUserInfo() { // 从Context中获取用户信息 $userInfo = Context::get('user'); // 根据用户信息查询用户 // ... // 返回用户信息给前端 return [ 'code' => 200, 'message' => 'success', 'data' => $userInfo, ]; } }
以上是如何使用Hyperf框架進行介面鑑權的詳細內容。更多資訊請關注PHP中文網其他相關文章!