diff --git a/ruoyi-fastapi-backend/.env.dev b/ruoyi-fastapi-backend/.env.dev index bcda2e8..0f22dfe 100644 --- a/ruoyi-fastapi-backend/.env.dev +++ b/ruoyi-fastapi-backend/.env.dev @@ -19,6 +19,8 @@ APP_WORKERS = 1 APP_IP_LOCATION_QUERY = true # 应用是否允许账号同时登录 APP_SAME_TIME_LOGIN = true +# 应用是否为演示模式 +APP_DEMO_MODE = false # 应用是否禁用Swagger文档 APP_DISABLE_SWAGGER = false # 应用是否禁用ReDoc文档 diff --git a/ruoyi-fastapi-backend/.env.dockermy b/ruoyi-fastapi-backend/.env.dockermy index 008861c..85f1d28 100644 --- a/ruoyi-fastapi-backend/.env.dockermy +++ b/ruoyi-fastapi-backend/.env.dockermy @@ -19,6 +19,8 @@ APP_WORKERS = 1 APP_IP_LOCATION_QUERY = true # 应用是否允许账号同时登录 APP_SAME_TIME_LOGIN = true +# 应用是否为演示模式 +APP_DEMO_MODE = false # 应用是否禁用Swagger文档 APP_DISABLE_SWAGGER = true # 应用是否禁用ReDoc文档 diff --git a/ruoyi-fastapi-backend/.env.dockerpg b/ruoyi-fastapi-backend/.env.dockerpg index a64b08a..5d53154 100644 --- a/ruoyi-fastapi-backend/.env.dockerpg +++ b/ruoyi-fastapi-backend/.env.dockerpg @@ -17,6 +17,8 @@ APP_RELOAD = false APP_WORKERS = 1 # 应用是否开启IP归属区域查询 APP_IP_LOCATION_QUERY = true +# 应用是否为演示模式 +APP_DEMO_MODE = false # 应用是否允许账号同时登录 APP_SAME_TIME_LOGIN = true # 应用是否禁用Swagger文档 diff --git a/ruoyi-fastapi-backend/.env.prod b/ruoyi-fastapi-backend/.env.prod index 746e35a..9d1bf5b 100644 --- a/ruoyi-fastapi-backend/.env.prod +++ b/ruoyi-fastapi-backend/.env.prod @@ -19,6 +19,8 @@ APP_WORKERS = 1 APP_IP_LOCATION_QUERY = true # 应用是否允许账号同时登录 APP_SAME_TIME_LOGIN = true +# 应用是否为演示模式 +APP_DEMO_MODE = false # 应用是否禁用Swagger文档 APP_DISABLE_SWAGGER = true # 应用是否禁用ReDoc文档 diff --git a/ruoyi-fastapi-backend/config/env.py b/ruoyi-fastapi-backend/config/env.py index a0b3064..89baec5 100644 --- a/ruoyi-fastapi-backend/config/env.py +++ b/ruoyi-fastapi-backend/config/env.py @@ -24,6 +24,7 @@ class AppSettings(BaseSettings): app_workers: int = 1 app_ip_location_query: bool = True app_same_time_login: bool = True + app_demo_mode: bool = False app_disable_swagger: bool = False app_disable_redoc: bool = False diff --git a/ruoyi-fastapi-backend/middlewares/demo_mode_middleware.py b/ruoyi-fastapi-backend/middlewares/demo_mode_middleware.py new file mode 100644 index 0000000..9ee92d6 --- /dev/null +++ b/ruoyi-fastapi-backend/middlewares/demo_mode_middleware.py @@ -0,0 +1,62 @@ +from fastapi import FastAPI, Request +from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint +from starlette.responses import Response + +from utils.log_util import logger +from utils.response_util import ResponseUtil + + +class DemoModeMiddleware(BaseHTTPMiddleware): + """ + 演示模式中间件 + """ + + async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response: + """ + 演示模式下拦截指定请求 + """ + url_path = str(request.url) + method = request.method.lower() + intercept_url_list = [ + 'system/user', + 'system/role', + 'system/menu', + 'system/dept', + 'system/post', + 'system/dict', + 'system/config', + 'system/notice', + 'monitor/operlog', + 'monitor/logininfor', + 'monitor/online', + 'monitor/job', + 'monitor/jobLog', + 'monitor/cache', + 'ai/model', + 'ai/chat', + ] + + for item in intercept_url_list: + if (url_path.startswith(f'{request.base_url!s}{item}') and method != 'get') or url_path.startswith( + ( + f'{request.base_url!s}common', + f'{request.base_url!s}register', + f'{request.base_url!s}tool/gen/createTable', + ) + ): + operate_ip = request.headers.get('X-Forwarded-For') + logger.warning( + '请求IP:{}||请求API:{}||请求方法:{}||请求结果:演示模式,不允许操作!', operate_ip, url_path, method + ) + return ResponseUtil.failure(msg='演示模式,不允许操作!') + response = await call_next(request) + return response + + +def add_demo_mode_middleware(app: FastAPI) -> None: + """ + 添加演示模式中间件 + + :param app: FastAPI对象 + """ + app.add_middleware(DemoModeMiddleware) diff --git a/ruoyi-fastapi-backend/middlewares/handle.py b/ruoyi-fastapi-backend/middlewares/handle.py index 235bc6a..4b5f9e6 100644 --- a/ruoyi-fastapi-backend/middlewares/handle.py +++ b/ruoyi-fastapi-backend/middlewares/handle.py @@ -1,7 +1,9 @@ from fastapi import FastAPI +from config.env import AppConfig from middlewares.context_middleware import add_context_cleanup_middleware from middlewares.cors_middleware import add_cors_middleware +from middlewares.demo_mode_middleware import add_demo_mode_middleware from middlewares.gzip_middleware import add_gzip_middleware from middlewares.trace_middleware import add_trace_middleware @@ -18,3 +20,6 @@ def handle_middleware(app: FastAPI) -> None: add_gzip_middleware(app) # 加载trace中间件 add_trace_middleware(app) + if AppConfig.app_demo_mode: + # 加载演示模式中间件 + add_demo_mode_middleware(app)