add request helper
This commit is contained in:
@@ -8,6 +8,7 @@ use App\Controller\AbstractController;
|
|||||||
use App\Middleware\AuthMiddleware;
|
use App\Middleware\AuthMiddleware;
|
||||||
use App\Model\User;
|
use App\Model\User;
|
||||||
use App\Service\OperationLogService;
|
use App\Service\OperationLogService;
|
||||||
|
use App\Utils\RequestHelper;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Hyperf\HttpServer\Annotation\Controller;
|
use Hyperf\HttpServer\Annotation\Controller;
|
||||||
use Hyperf\HttpServer\Annotation\Middleware;
|
use Hyperf\HttpServer\Annotation\Middleware;
|
||||||
@@ -259,7 +260,7 @@ class AuthController extends AbstractController
|
|||||||
target_type: 'user',
|
target_type: 'user',
|
||||||
target_id: $user->id,
|
target_id: $user->id,
|
||||||
description: "用户 {$user->username} 登录",
|
description: "用户 {$user->username} 登录",
|
||||||
ip: OperationLogService::getRequestIp(),
|
ip: RequestHelper::getClientIp($this->request),
|
||||||
);
|
);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@@ -644,7 +645,7 @@ class AuthController extends AbstractController
|
|||||||
target_type: 'user',
|
target_type: 'user',
|
||||||
target_id: $user->id,
|
target_id: $user->id,
|
||||||
description: "用户 {$user->username} 修改密码",
|
description: "用户 {$user->username} 修改密码",
|
||||||
ip: OperationLogService::getRequestIp(),
|
ip: RequestHelper::getClientIp($this->request),
|
||||||
);
|
);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@@ -687,7 +688,7 @@ class AuthController extends AbstractController
|
|||||||
target_type: 'user',
|
target_type: 'user',
|
||||||
target_id: $user->id,
|
target_id: $user->id,
|
||||||
description: "用户 {$user->username} 退出登录",
|
description: "用户 {$user->username} 退出登录",
|
||||||
ip: OperationLogService::getRequestIp(),
|
ip: RequestHelper::getClientIp($this->request),
|
||||||
);
|
);
|
||||||
|
|
||||||
// 清除 refresh token
|
// 清除 refresh token
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use App\Middleware\AuthMiddleware;
|
|||||||
use App\Middleware\PermissionMiddleware;
|
use App\Middleware\PermissionMiddleware;
|
||||||
use App\Model\Company;
|
use App\Model\Company;
|
||||||
use App\Service\OperationLogService;
|
use App\Service\OperationLogService;
|
||||||
|
use App\Utils\RequestHelper;
|
||||||
use App\Model\Platform;
|
use App\Model\Platform;
|
||||||
use App\Model\Store;
|
use App\Model\Store;
|
||||||
use App\Model\User;
|
use App\Model\User;
|
||||||
@@ -246,7 +247,7 @@ class DataScopeController extends AbstractController
|
|||||||
target_id: $id,
|
target_id: $id,
|
||||||
description: "更新用户 #{$id} 数据权限",
|
description: "更新用户 #{$id} 数据权限",
|
||||||
detail: ['scopes' => $scopes],
|
detail: ['scopes' => $scopes],
|
||||||
ip: OperationLogService::getRequestIp(),
|
ip: RequestHelper::getClientIp($this->request),
|
||||||
);
|
);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use App\Middleware\AuthMiddleware;
|
|||||||
use App\Middleware\PermissionMiddleware;
|
use App\Middleware\PermissionMiddleware;
|
||||||
use App\Model\Role;
|
use App\Model\Role;
|
||||||
use App\Service\OperationLogService;
|
use App\Service\OperationLogService;
|
||||||
|
use App\Utils\RequestHelper;
|
||||||
use App\Model\RoleRouteOverride;
|
use App\Model\RoleRouteOverride;
|
||||||
use App\Model\Route;
|
use App\Model\Route;
|
||||||
use App\Model\RouteGroup;
|
use App\Model\RouteGroup;
|
||||||
@@ -180,7 +181,7 @@ class RoleController extends AbstractController
|
|||||||
target_id: $id,
|
target_id: $id,
|
||||||
description: "用户 #{$id} 角色变更为 {$new_role->name}",
|
description: "用户 #{$id} 角色变更为 {$new_role->name}",
|
||||||
detail: ['role_id' => $role_id, 'role_name' => $new_role->name],
|
detail: ['role_id' => $role_id, 'role_name' => $new_role->name],
|
||||||
ip: OperationLogService::getRequestIp(),
|
ip: RequestHelper::getClientIp($this->request),
|
||||||
);
|
);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use App\Middleware\AuthMiddleware;
|
|||||||
use App\Middleware\PermissionMiddleware;
|
use App\Middleware\PermissionMiddleware;
|
||||||
use App\Model\User;
|
use App\Model\User;
|
||||||
use App\Service\OperationLogService;
|
use App\Service\OperationLogService;
|
||||||
|
use App\Utils\RequestHelper;
|
||||||
use Hyperf\HttpServer\Annotation\Controller;
|
use Hyperf\HttpServer\Annotation\Controller;
|
||||||
use Hyperf\HttpServer\Annotation\Middleware;
|
use Hyperf\HttpServer\Annotation\Middleware;
|
||||||
use Hyperf\HttpServer\Annotation\RequestMapping;
|
use Hyperf\HttpServer\Annotation\RequestMapping;
|
||||||
@@ -238,7 +239,7 @@ class UserController extends AbstractController
|
|||||||
target_id: $user->id,
|
target_id: $user->id,
|
||||||
description: "创建用户 {$username}",
|
description: "创建用户 {$username}",
|
||||||
detail: ['email' => $email, 'status' => $status],
|
detail: ['email' => $email, 'status' => $status],
|
||||||
ip: OperationLogService::getRequestIp(),
|
ip: RequestHelper::getClientIp($this->request),
|
||||||
);
|
);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@@ -448,7 +449,7 @@ class UserController extends AbstractController
|
|||||||
target_id: $user->id,
|
target_id: $user->id,
|
||||||
description: "更新用户 {$user->username} 信息",
|
description: "更新用户 {$user->username} 信息",
|
||||||
detail: $updates,
|
detail: $updates,
|
||||||
ip: OperationLogService::getRequestIp(),
|
ip: RequestHelper::getClientIp($this->request),
|
||||||
);
|
);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@@ -537,7 +538,7 @@ class UserController extends AbstractController
|
|||||||
target_id: $user->id,
|
target_id: $user->id,
|
||||||
description: "用户 {$user->username} 状态变更",
|
description: "用户 {$user->username} 状态变更",
|
||||||
detail: ['old_status' => $old_status, 'new_status' => $user->status],
|
detail: ['old_status' => $old_status, 'new_status' => $user->status],
|
||||||
ip: OperationLogService::getRequestIp(),
|
ip: RequestHelper::getClientIp($this->request),
|
||||||
);
|
);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ namespace App\Middleware;
|
|||||||
|
|
||||||
use App\Model\ApiRequestLog;
|
use App\Model\ApiRequestLog;
|
||||||
use App\Utils\Log;
|
use App\Utils\Log;
|
||||||
|
use App\Utils\RequestHelper;
|
||||||
use Psr\Http\Message\ResponseInterface;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
use Psr\Http\Message\ServerRequestInterface;
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
use Psr\Http\Server\MiddlewareInterface;
|
use Psr\Http\Server\MiddlewareInterface;
|
||||||
@@ -39,7 +40,7 @@ class RequestLogMiddleware implements MiddlewareInterface
|
|||||||
$method = $request->getMethod();
|
$method = $request->getMethod();
|
||||||
$path = $request->getUri()->getPath();
|
$path = $request->getUri()->getPath();
|
||||||
$status_code = $response->getStatusCode();
|
$status_code = $response->getStatusCode();
|
||||||
$ip = self::getClientIp($request);
|
$ip = RequestHelper::getClientIp($request);
|
||||||
$user_agent = $request->getHeaderLine('User-Agent') ?: null;
|
$user_agent = $request->getHeaderLine('User-Agent') ?: null;
|
||||||
|
|
||||||
// GET/DELETE 请求不记录请求体
|
// GET/DELETE 请求不记录请求体
|
||||||
@@ -130,26 +131,4 @@ class RequestLogMiddleware implements MiddlewareInterface
|
|||||||
return null;
|
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;
|
namespace App\Service;
|
||||||
|
|
||||||
use App\Middleware\RequestLogMiddleware;
|
|
||||||
use App\Model\OperationLog;
|
use App\Model\OperationLog;
|
||||||
use App\Model\User;
|
use App\Model\User;
|
||||||
use App\Utils\Log;
|
use App\Utils\Log;
|
||||||
use Psr\Http\Message\ServerRequestInterface;
|
|
||||||
use Qbhy\HyperfAuth\AuthManager;
|
use Qbhy\HyperfAuth\AuthManager;
|
||||||
use Swoole\Coroutine;
|
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
|
* 从当前认证上下文获取用户 ID
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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;
|
namespace HyperfTest\Cases\Unit\Middleware;
|
||||||
|
|
||||||
use App\Middleware\RequestLogMiddleware;
|
use App\Middleware\RequestLogMiddleware;
|
||||||
|
use App\Utils\RequestHelper;
|
||||||
use GuzzleHttp\Psr7\Response;
|
use GuzzleHttp\Psr7\Response;
|
||||||
use GuzzleHttp\Psr7\ServerRequest;
|
use GuzzleHttp\Psr7\ServerRequest;
|
||||||
use PHPUnit\Framework\TestCase;
|
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']);
|
$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);
|
$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']);
|
$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);
|
$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']);
|
$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);
|
$this->assertSame('192.168.1.1', $ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,7 +137,7 @@ class RequestLogMiddlewareTest extends TestCase
|
|||||||
{
|
{
|
||||||
$request = new ServerRequest('GET', '/test');
|
$request = new ServerRequest('GET', '/test');
|
||||||
|
|
||||||
$ip = RequestLogMiddleware::getClientIp($request);
|
$ip = RequestHelper::getClientIp($request);
|
||||||
$this->assertNull($ip);
|
$this->assertNull($ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user