add request helper

This commit is contained in:
2026-03-18 08:49:10 +08:00
parent 58afb7c385
commit f3f73935e1
8 changed files with 51 additions and 54 deletions
@@ -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
@@ -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 [
@@ -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 [
@@ -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 [
@@ -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;
}
}
@@ -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
*/
+32
View File
@@ -0,0 +1,32 @@
<?php
declare(strict_types=1);
namespace App\Utils;
use Psr\Http\Message\ServerRequestInterface;
class RequestHelper
{
/**
* 获取客户端真实 IP
*
* 优先级:X-Forwarded-For → X-Real-IP → ServerParams remote_addr
*/
public static function getClientIp(ServerRequestInterface $request): ?string
{
$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;
}
}
@@ -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);
}