mirror of
http://124.126.16.154:8888/singularity/hyperf-admin.git
synced 2026-01-15 07:35:09 +08:00
perf: 增加remote module 请求转发模式
This commit is contained in:
@@ -194,11 +194,9 @@ class MenuController extends AdminAbstractController
|
||||
'permission|权限标识' => [
|
||||
'type' => 'select',
|
||||
'default' => [],
|
||||
'options' => function ($field, $data) {
|
||||
return $this->permission_service->getSystemRouteOptions();
|
||||
},
|
||||
'props' => [
|
||||
'multiple' => true,
|
||||
'selectApi' => '/system/routes?module={module}'
|
||||
],
|
||||
],
|
||||
'pid|上级类目' => [
|
||||
@@ -272,7 +270,7 @@ class MenuController extends AdminAbstractController
|
||||
[
|
||||
'text' => '加子菜单',
|
||||
'type' => 'form',
|
||||
'target' => '/menu/form?pid[]={id}&module={tab_id}',
|
||||
'target' => '/menu/form?pid[]={id}&module={module}',
|
||||
'formUi' => [
|
||||
'form' => [
|
||||
'labelWidth' => '80px',
|
||||
@@ -330,6 +328,7 @@ class MenuController extends AdminAbstractController
|
||||
'columns' => [
|
||||
['field' => 'id', 'hidden' => true],
|
||||
['field' => 'pid', 'hidden' => true],
|
||||
['field' => 'module', 'hidden' => true],
|
||||
[
|
||||
'field' => 'label',
|
||||
'width' => '250px',
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
<?php
|
||||
namespace HyperfAdmin\Admin\Controller;
|
||||
|
||||
use HyperfAdmin\Admin\Model\ExportTasks;
|
||||
use Hyperf\Utils\Str;
|
||||
use HyperfAdmin\Admin\Service\CommonConfig;
|
||||
use HyperfAdmin\Admin\Service\ExportService;
|
||||
use HyperfAdmin\BaseUtils\Constants\ErrorCode;
|
||||
use HyperfAdmin\Admin\Service\ModuleProxy;
|
||||
|
||||
class SystemController extends AdminAbstractController
|
||||
{
|
||||
@@ -26,4 +25,19 @@ class SystemController extends AdminAbstractController
|
||||
|
||||
return $this->success($config);
|
||||
}
|
||||
|
||||
public function routes()
|
||||
{
|
||||
$module_proxy = make(ModuleProxy::class);
|
||||
if ($module_proxy->needProxy()) {
|
||||
return $this->success($module_proxy->request()['payload']);
|
||||
}
|
||||
|
||||
$kw = $this->request->input('kw', '');
|
||||
$routes = $this->permission_service->getSystemRouteOptions();
|
||||
$routes = array_filter($routes, function ($item) use ($kw) {
|
||||
return Str::contains($item['value'], $kw);
|
||||
});
|
||||
return $this->success(array_values($routes));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,18 +5,25 @@
|
||||
*/
|
||||
namespace HyperfAdmin\Admin\Middleware;
|
||||
|
||||
use FastRoute\Dispatcher;
|
||||
use Hyperf\HttpServer\Contract\RequestInterface;
|
||||
use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
|
||||
use Hyperf\HttpServer\CoreMiddleware;
|
||||
use Hyperf\HttpServer\Router\Dispatched;
|
||||
use Hyperf\Logger\LoggerFactory;
|
||||
use HyperfAdmin\Admin\Service\AuthService;
|
||||
use HyperfAdmin\Admin\Service\CommonConfig;
|
||||
use HyperfAdmin\Admin\Service\ModuleProxy;
|
||||
use HyperfAdmin\Admin\Service\PermissionService;
|
||||
use HyperfAdmin\BaseUtils\AKSK;
|
||||
use HyperfAdmin\BaseUtils\Constants\ErrorCode;
|
||||
use HyperfAdmin\BaseUtils\Guzzle;
|
||||
use HyperfAdmin\BaseUtils\Log;
|
||||
use HyperfAdmin\BaseUtils\Redis\Redis;
|
||||
use Psr\Container\ContainerInterface;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use Psr\Http\Server\RequestHandlerInterface;
|
||||
use HyperfAdmin\Admin\Service\PermissionService;
|
||||
use HyperfAdmin\Admin\Service\AuthService;
|
||||
use HyperfAdmin\BaseUtils\AKSK;
|
||||
use HyperfAdmin\BaseUtils\Constants\ErrorCode;
|
||||
|
||||
class PermissionMiddleware extends CoreMiddleware
|
||||
{
|
||||
@@ -61,6 +68,18 @@ class PermissionMiddleware extends CoreMiddleware
|
||||
$uri = $request->getUri();
|
||||
$path = $uri->getPath();
|
||||
$method = $request->getMethod();
|
||||
|
||||
$module_proxy = make(ModuleProxy::class);
|
||||
if ($module_proxy->needProxy()) {
|
||||
$res = $module_proxy->request();
|
||||
if(isset($res['payload']) && $res['payload'] === []) {
|
||||
$res['payload'] = (object)[];
|
||||
}
|
||||
$response = $this->response->json($res);
|
||||
Log::get('http')->info('proxy_end', ['module' => $module_proxy->getTargetModule(), 'path' => $path, 'response' => $response]);
|
||||
return $response;
|
||||
}
|
||||
|
||||
// 其他系统调用,走AKSK中间件验证
|
||||
$client_token = $request->getHeader('Authorization')[0] ?? '';
|
||||
if ($client_token) {
|
||||
|
||||
52
src/admin/src/Service/ModuleProxy.php
Normal file
52
src/admin/src/Service/ModuleProxy.php
Normal file
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace HyperfAdmin\Admin\Service;
|
||||
|
||||
use HyperfAdmin\BaseUtils\Guzzle;
|
||||
use HyperfAdmin\BaseUtils\Redis\Redis;
|
||||
|
||||
class ModuleProxy
|
||||
{
|
||||
protected $request;
|
||||
protected $modules;
|
||||
protected $target_module;
|
||||
public function __construct()
|
||||
{
|
||||
$this->request = request();
|
||||
$this->modules = Redis::getOrSet('hyperf_admin:system_modules', 500, function () {
|
||||
$list = CommonConfig::getConfigByName('website_config')['value']['system_module'];
|
||||
array_change_v2k($list, 'name');
|
||||
return $list;
|
||||
});
|
||||
$this->target_module = $this->request->input('module') ?? (request_header('x-module')[0] ?? '');
|
||||
}
|
||||
|
||||
public function needProxy()
|
||||
{
|
||||
$no_proxy = request_header('x-no-proxy')[0] ?? false;
|
||||
|
||||
if ($no_proxy) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isset($this->modules[$this->target_module])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->modules[$this->target_module]['type'] != 'remote') {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function request()
|
||||
{
|
||||
return Guzzle::proxy($this->modules[$this->target_module]['remote_base_uri'] . $this->request->getUri()->getPath(), $this->request);
|
||||
}
|
||||
|
||||
public function getTargetModule()
|
||||
{
|
||||
return $this->target_module;
|
||||
}
|
||||
}
|
||||
@@ -243,7 +243,8 @@ class PermissionService
|
||||
}
|
||||
}
|
||||
$user_open_apis = $this->getOpenResourceList('user_open_api');
|
||||
return array_merge($resources, $user_open_apis);
|
||||
$system_user_open = config('system.user_open_resource', ['/system/routes']);
|
||||
return array_merge($resources, $user_open_apis, $system_user_open);
|
||||
}
|
||||
|
||||
public function getOpenResourceList($field = 'open_api')
|
||||
|
||||
@@ -38,3 +38,4 @@ register_route('/cconf', CommonConfigController::class, function ($controller) {
|
||||
});
|
||||
|
||||
Router::get('/system/config', [SystemController::class, 'config']);
|
||||
Router::get('/system/routes', [SystemController::class, 'routes']);
|
||||
|
||||
Reference in New Issue
Block a user