From f3f73935e11d3a62ea93ce66395256db9850343c Mon Sep 17 00:00:00 2001 From: Nick Zeng Date: Wed, 18 Mar 2026 08:49:10 +0800 Subject: [PATCH] add request helper --- .../app/Controller/api/v1/AuthController.php | 7 ++-- .../Controller/api/v1/DataScopeController.php | 3 +- .../app/Controller/api/v1/RoleController.php | 3 +- .../app/Controller/api/v1/UserController.php | 7 ++-- .../app/Middleware/RequestLogMiddleware.php | 25 ++------------- backend/app/Service/OperationLogService.php | 19 ----------- backend/app/Utils/RequestHelper.php | 32 +++++++++++++++++++ .../Middleware/RequestLogMiddlewareTest.php | 9 +++--- 8 files changed, 51 insertions(+), 54 deletions(-) create mode 100644 backend/app/Utils/RequestHelper.php diff --git a/backend/app/Controller/api/v1/AuthController.php b/backend/app/Controller/api/v1/AuthController.php index 3bc6cee..1b735dc 100644 --- a/backend/app/Controller/api/v1/AuthController.php +++ b/backend/app/Controller/api/v1/AuthController.php @@ -8,6 +8,7 @@ use App\Controller\AbstractController; use App\Middleware\AuthMiddleware; use App\Model\User; use App\Service\OperationLogService; +use App\Utils\RequestHelper; use Carbon\Carbon; use Hyperf\HttpServer\Annotation\Controller; use Hyperf\HttpServer\Annotation\Middleware; @@ -259,7 +260,7 @@ class AuthController extends AbstractController target_type: 'user', target_id: $user->id, description: "用户 {$user->username} 登录", - ip: OperationLogService::getRequestIp(), + ip: RequestHelper::getClientIp($this->request), ); return [ @@ -644,7 +645,7 @@ class AuthController extends AbstractController target_type: 'user', target_id: $user->id, description: "用户 {$user->username} 修改密码", - ip: OperationLogService::getRequestIp(), + ip: RequestHelper::getClientIp($this->request), ); return [ @@ -687,7 +688,7 @@ class AuthController extends AbstractController target_type: 'user', target_id: $user->id, description: "用户 {$user->username} 退出登录", - ip: OperationLogService::getRequestIp(), + ip: RequestHelper::getClientIp($this->request), ); // 清除 refresh token diff --git a/backend/app/Controller/api/v1/DataScopeController.php b/backend/app/Controller/api/v1/DataScopeController.php index bac7d51..7109bc6 100644 --- a/backend/app/Controller/api/v1/DataScopeController.php +++ b/backend/app/Controller/api/v1/DataScopeController.php @@ -9,6 +9,7 @@ use App\Middleware\AuthMiddleware; use App\Middleware\PermissionMiddleware; use App\Model\Company; use App\Service\OperationLogService; +use App\Utils\RequestHelper; use App\Model\Platform; use App\Model\Store; use App\Model\User; @@ -246,7 +247,7 @@ class DataScopeController extends AbstractController target_id: $id, description: "更新用户 #{$id} 数据权限", detail: ['scopes' => $scopes], - ip: OperationLogService::getRequestIp(), + ip: RequestHelper::getClientIp($this->request), ); return [ diff --git a/backend/app/Controller/api/v1/RoleController.php b/backend/app/Controller/api/v1/RoleController.php index da1f101..597176a 100644 --- a/backend/app/Controller/api/v1/RoleController.php +++ b/backend/app/Controller/api/v1/RoleController.php @@ -9,6 +9,7 @@ use App\Middleware\AuthMiddleware; use App\Middleware\PermissionMiddleware; use App\Model\Role; use App\Service\OperationLogService; +use App\Utils\RequestHelper; use App\Model\RoleRouteOverride; use App\Model\Route; use App\Model\RouteGroup; @@ -180,7 +181,7 @@ class RoleController extends AbstractController target_id: $id, description: "用户 #{$id} 角色变更为 {$new_role->name}", detail: ['role_id' => $role_id, 'role_name' => $new_role->name], - ip: OperationLogService::getRequestIp(), + ip: RequestHelper::getClientIp($this->request), ); return [ diff --git a/backend/app/Controller/api/v1/UserController.php b/backend/app/Controller/api/v1/UserController.php index f75f088..f01908b 100644 --- a/backend/app/Controller/api/v1/UserController.php +++ b/backend/app/Controller/api/v1/UserController.php @@ -9,6 +9,7 @@ use App\Middleware\AuthMiddleware; use App\Middleware\PermissionMiddleware; use App\Model\User; use App\Service\OperationLogService; +use App\Utils\RequestHelper; use Hyperf\HttpServer\Annotation\Controller; use Hyperf\HttpServer\Annotation\Middleware; use Hyperf\HttpServer\Annotation\RequestMapping; @@ -238,7 +239,7 @@ class UserController extends AbstractController target_id: $user->id, description: "创建用户 {$username}", detail: ['email' => $email, 'status' => $status], - ip: OperationLogService::getRequestIp(), + ip: RequestHelper::getClientIp($this->request), ); return [ @@ -448,7 +449,7 @@ class UserController extends AbstractController target_id: $user->id, description: "更新用户 {$user->username} 信息", detail: $updates, - ip: OperationLogService::getRequestIp(), + ip: RequestHelper::getClientIp($this->request), ); return [ @@ -537,7 +538,7 @@ class UserController extends AbstractController target_id: $user->id, description: "用户 {$user->username} 状态变更", detail: ['old_status' => $old_status, 'new_status' => $user->status], - ip: OperationLogService::getRequestIp(), + ip: RequestHelper::getClientIp($this->request), ); return [ diff --git a/backend/app/Middleware/RequestLogMiddleware.php b/backend/app/Middleware/RequestLogMiddleware.php index 639226d..cb605f6 100644 --- a/backend/app/Middleware/RequestLogMiddleware.php +++ b/backend/app/Middleware/RequestLogMiddleware.php @@ -6,6 +6,7 @@ namespace App\Middleware; use App\Model\ApiRequestLog; use App\Utils\Log; +use App\Utils\RequestHelper; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; @@ -39,7 +40,7 @@ class RequestLogMiddleware implements MiddlewareInterface $method = $request->getMethod(); $path = $request->getUri()->getPath(); $status_code = $response->getStatusCode(); - $ip = self::getClientIp($request); + $ip = RequestHelper::getClientIp($request); $user_agent = $request->getHeaderLine('User-Agent') ?: null; // GET/DELETE 请求不记录请求体 @@ -130,26 +131,4 @@ class RequestLogMiddleware implements MiddlewareInterface return null; } - /** - * 获取客户端真实 IP - * - * 优先级:X-Forwarded-For → X-Real-IP → ServerParams remote_addr - */ - public static function getClientIp(ServerRequestInterface $request): ?string - { - // X-Forwarded-For 可能包含多个 IP,取第一个 - $forwarded_for = $request->getHeaderLine('X-Forwarded-For'); - if ($forwarded_for !== '') { - $ips = explode(',', $forwarded_for); - return trim($ips[0]); - } - - $real_ip = $request->getHeaderLine('X-Real-IP'); - if ($real_ip !== '') { - return trim($real_ip); - } - - $server_params = $request->getServerParams(); - return $server_params['remote_addr'] ?? null; - } } diff --git a/backend/app/Service/OperationLogService.php b/backend/app/Service/OperationLogService.php index b458d5a..160b1eb 100644 --- a/backend/app/Service/OperationLogService.php +++ b/backend/app/Service/OperationLogService.php @@ -4,11 +4,9 @@ declare(strict_types=1); namespace App\Service; -use App\Middleware\RequestLogMiddleware; use App\Model\OperationLog; use App\Model\User; use App\Utils\Log; -use Psr\Http\Message\ServerRequestInterface; use Qbhy\HyperfAuth\AuthManager; use Swoole\Coroutine; @@ -48,23 +46,6 @@ class OperationLogService }); } - /** - * 从当前请求上下文获取客户端 IP - */ - public static function getRequestIp(): ?string - { - try { - $container = \Hyperf\Context\ApplicationContext::getContainer(); - $request = $container->get(ServerRequestInterface::class); - return RequestLogMiddleware::getClientIp($request); - } catch (\Throwable $e) { - Log::get()->warning('OperationLogService: 获取客户端 IP 失败', [ - 'error' => $e->getMessage(), - ]); - return null; - } - } - /** * 从当前认证上下文获取用户 ID */ diff --git a/backend/app/Utils/RequestHelper.php b/backend/app/Utils/RequestHelper.php new file mode 100644 index 0000000..3714dc4 --- /dev/null +++ b/backend/app/Utils/RequestHelper.php @@ -0,0 +1,32 @@ +getHeaderLine('X-Forwarded-For'); + if ($forwarded_for !== '') { + $ips = explode(',', $forwarded_for); + return trim($ips[0]); + } + + $real_ip = $request->getHeaderLine('X-Real-IP'); + if ($real_ip !== '') { + return trim($real_ip); + } + + $server_params = $request->getServerParams(); + return $server_params['remote_addr'] ?? null; + } +} diff --git a/backend/test/Cases/Unit/Middleware/RequestLogMiddlewareTest.php b/backend/test/Cases/Unit/Middleware/RequestLogMiddlewareTest.php index 7986986..dda706a 100644 --- a/backend/test/Cases/Unit/Middleware/RequestLogMiddlewareTest.php +++ b/backend/test/Cases/Unit/Middleware/RequestLogMiddlewareTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace HyperfTest\Cases\Unit\Middleware; use App\Middleware\RequestLogMiddleware; +use App\Utils\RequestHelper; use GuzzleHttp\Psr7\Response; use GuzzleHttp\Psr7\ServerRequest; use PHPUnit\Framework\TestCase; @@ -112,7 +113,7 @@ class RequestLogMiddlewareTest extends TestCase { $request = new ServerRequest('GET', '/test', ['X-Forwarded-For' => '1.2.3.4, 5.6.7.8']); - $ip = RequestLogMiddleware::getClientIp($request); + $ip = RequestHelper::getClientIp($request); $this->assertSame('1.2.3.4', $ip); } @@ -120,7 +121,7 @@ class RequestLogMiddlewareTest extends TestCase { $request = new ServerRequest('GET', '/test', ['X-Real-IP' => '10.0.0.1']); - $ip = RequestLogMiddleware::getClientIp($request); + $ip = RequestHelper::getClientIp($request); $this->assertSame('10.0.0.1', $ip); } @@ -128,7 +129,7 @@ class RequestLogMiddlewareTest extends TestCase { $request = new ServerRequest('GET', '/test', [], null, '1.1', ['remote_addr' => '192.168.1.1']); - $ip = RequestLogMiddleware::getClientIp($request); + $ip = RequestHelper::getClientIp($request); $this->assertSame('192.168.1.1', $ip); } @@ -136,7 +137,7 @@ class RequestLogMiddlewareTest extends TestCase { $request = new ServerRequest('GET', '/test'); - $ip = RequestLogMiddleware::getClientIp($request); + $ip = RequestHelper::getClientIp($request); $this->assertNull($ip); }