Files
RuoYi-Vue3-FastAPI/ruoyi-fastapi-backend/plugins/core/runtime/route_guard.py
T
insistence ae852b8501 feat: 新增多数据源功能 (#123)
* feat: 新增多数据源功能

* perf: 优化多worker下数据源打印重复日志的问题

* perf: 优化代码

* perf: 优化代码

* chore: 固定ai插件相关依赖
2026-08-21 15:26:24 +08:00

83 lines
2.3 KiB
Python

from typing import Protocol, runtime_checkable
from fastapi import Depends, params
from sqlalchemy.ext.asyncio import AsyncSession
from common.aspect.db_session import DBSessionDependency
from exceptions.exception import PermissionException
@runtime_checkable
class PluginRouteStateGateway(Protocol):
"""
插件路由状态读取端口。
"""
async def is_plugin_enabled(self, db: AsyncSession, plugin_id: str) -> bool:
"""
判断插件路由是否允许访问。
:param db: orm对象
:param plugin_id: 插件ID
:return: 插件是否启用
"""
class UnavailablePluginRouteStateGateway:
"""
不可用的插件路由状态读取端口。
"""
@staticmethod
async def is_plugin_enabled(db: AsyncSession, plugin_id: str) -> bool:
"""
判断插件路由是否允许访问。
:param db: orm对象
:param plugin_id: 插件ID
:return: 插件是否启用
:raises RuntimeError: 默认端口不提供状态读取能力
"""
raise RuntimeError('插件路由状态适配器不可用')
class CheckPluginEnabled:
"""
校验插件路由运行时启用状态。
"""
def __init__(self, plugin_id: str, state_gateway: PluginRouteStateGateway | None = None) -> None:
"""
初始化插件路由状态校验器。
:param plugin_id: 插件ID
:param state_gateway: 插件路由状态读取端口
"""
self.plugin_id = plugin_id
self.state_gateway = state_gateway or UnavailablePluginRouteStateGateway()
async def __call__(self, db: AsyncSession = DBSessionDependency()) -> bool:
"""
执行插件启用状态校验。
:param db: orm对象
:return: 是否通过
"""
if not await self.state_gateway.is_plugin_enabled(db, self.plugin_id):
raise PermissionException(data='', message='插件未启用,接口不可访问')
return True
def PluginEnabledDependency( # noqa: N802
plugin_id: str,
state_gateway: PluginRouteStateGateway | None = None,
) -> params.Depends:
"""
插件路由启用状态依赖。
:param plugin_id: 插件ID
:param state_gateway: 插件路由状态读取端口
:return: 插件启用状态依赖
"""
return Depends(CheckPluginEnabled(plugin_id, state_gateway))