Files
insistence a89aec54aa feat: 新增 OAuth 2.0 / OIDC 统一认证中心 (#129)
* feat: 新增统一认证中心

* perf: 优化代码

* fix: 修复问题

* perf: 优化页面

* fix: 修复部分接口缺失Request参数的问题

* perf: 优化访问控制机制

* perf: 优化代码

* fix: 修复 Logout Token 缺少 exp

* perf&fix: 优化和修复

* perf: 优化代码

* perf: 优化代码

* fix: 修复测试问题
2026-10-01 22:56:05 +08:00

286 lines
15 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -------- 应用配置 --------
# 应用运行环境
APP_ENV = 'prod'
# 应用名称
APP_NAME = 'RuoYi-FastAPI'
# 应用代理路径
APP_ROOT_PATH = '/docker-api'
# 应用主机
APP_HOST = '0.0.0.0'
# 应用端口
APP_PORT = 9099
# 应用版本
APP_VERSION= '1.10.0'
# 发布代际标识(生产滚动发布建议注入镜像 digest 或 commit SHA;留空时使用源码指纹)
APP_RELEASE_ID = ''
# 应用是否开启热重载
APP_RELOAD = false
# 应用工作进程数
APP_WORKERS = 1
# 应用是否开启IP归属区域查询
APP_IP_LOCATION_QUERY = true
# 应用是否为演示模式
APP_DEMO_MODE = false
# 应用是否允许账号同时登录
APP_SAME_TIME_LOGIN = true
# 应用是否禁用Swagger文档
APP_DISABLE_SWAGGER = true
# 应用是否禁用ReDoc文档
APP_DISABLE_REDOC = true
# 可信代理IP列表,多个值使用逗号分隔
APP_TRUSTED_PROXY_IPS = '127.0.0.1,::1'
# 可信代理跳数,单层Nginx代理通常为1
APP_TRUSTED_PROXY_HOPS = 1
# 首次启动默认安装并启用的内置插件,多个值使用逗号分隔,留空表示不自动启用
APP_DEFAULT_ENABLED_PLUGINS = 'ai'
# 应用业务时区,使用IANA时区名称(如Asia/Shanghai),用于时间展示、日期范围查询和定时任务默认时区
APP_TIMEZONE = 'Asia/Shanghai'
# -------- Jwt配置 --------
# Jwt秘钥,留空时自动生成;也可使用 openssl rand -hex 32 手动生成
JWT_SECRET_KEY = ''
# Jwt算法
JWT_ALGORITHM = 'HS256'
# 令牌过期时间
JWT_EXPIRE_MINUTES = 1440
# redis中令牌过期时间
JWT_REDIS_EXPIRE_MINUTES = 30
# -------- 数据库配置 --------
# 默认数据源名称
DB_DEFAULT_SOURCE = 'primary'
# 数据源配置(每个节点完整保留数据库连接字段)
# db_type:数据库类型,可选 mysql、postgresql
# db_host:数据库主机地址
# db_port:数据库端口
# db_username:数据库用户名
# db_password:数据库密码
# db_database:数据库名称
# db_echo:是否输出SQLAlchemy SQL日志
# db_connect_timeout:建立数据库连接的超时时间(秒)
# db_max_overflow:连接池允许的最大溢出连接数
# db_pool_size:连接池常驻连接数
# db_pool_recycle:连接回收间隔(秒),-1表示禁用回收
# db_pool_timeout:获取连接的超时时间(秒)
# db_required:启动时连接失败是否阻止应用启动
DB_SOURCES = '{
"primary": {
"db_type": "postgresql",
"db_host": "ruoyi-pg",
"db_port": 5432,
"db_username": "postgres",
"db_password": "root",
"db_database": "ruoyi-fastapi",
"db_echo": true,
"db_connect_timeout": 10,
"db_max_overflow": 10,
"db_pool_size": 50,
"db_pool_recycle": 3600,
"db_pool_timeout": 30,
"db_required": true
}
}'
# -------- Redis配置 --------
# Redis主机
REDIS_HOST = 'ruoyi-redis'
# Redis端口
REDIS_PORT = 6379
# Redis用户名
REDIS_USERNAME = ''
# Redis密码
REDIS_PASSWORD = ''
# Redis数据库
REDIS_DATABASE = 2
# -------- 日志配置 --------
# 是否启用日志脱敏
LOG_MASK_ENABLED = true
# 日志脱敏占位符
LOG_MASK_PLACEHOLDER = '******'
# 以下三项为互补关系(非互斥):
# 1) LOG_MASK_FIELDS:命中后执行全量脱敏
# 2) LOG_PARTIAL_MASK_FIELDS:命中后执行部分脱敏
# 3) LOG_CONFIG_SECRET_PATTERNS:按 configKey 关键词决定是否脱敏 configValue
# 全量脱敏字段,多个值使用逗号分隔
LOG_MASK_FIELDS = 'password,old_password,new_password,confirm_password,api_key,token,access_token,refresh_token,authorization,client_secret,secret,secret_key,private_key,private_key_pem,credential,credentials,sms_code,captcha_code,system_prompt'
# 部分脱敏字段,多个值使用逗号分隔
# 当前默认不对IP脱敏;如后期需要开启,可直接追加 ip,ipaddr,oper_ip,login_ip 并重启服务
LOG_PARTIAL_MASK_FIELDS = 'phonenumber,phone,mobile,email'
# 按配置键名识别敏感配置的关键词,多个值使用逗号分隔
LOG_CONFIG_SECRET_PATTERNS = 'password,token,secret,key,private,credential,access,jwt,captcha,sms'
# Redis Stream Key
LOG_STREAM_KEY = 'log:stream'
# Redis Stream 消费组名称
LOG_STREAM_GROUP = 'log_aggregator'
# Redis Stream 消费者名称前缀
LOG_STREAM_CONSUMER_PREFIX = 'worker'
# 每次读取的最大消息数量
LOG_STREAM_BATCH_SIZE = 100
# 阻塞读取等待时间(毫秒)
LOG_STREAM_BLOCK_MS = 2000
# Stream 最大长度(近似裁剪)
LOG_STREAM_MAXLEN = 100000
# Pending 回收最小空闲时间(毫秒)
LOG_STREAM_CLAIM_IDLE_MS = 60000
# Pending 回收检查间隔(毫秒)
LOG_STREAM_CLAIM_INTERVAL_MS = 5000
# 每次回收的最大消息数量
LOG_STREAM_CLAIM_BATCH_SIZE = 100
# 去重 Key 过期时间(秒)
LOG_STREAM_DEDUP_TTL = 3600
# 去重 Key 前缀
LOG_STREAM_DEDUP_PREFIX = 'log:dedup'
# stdout 输出是否为 JSON
LOGURU_JSON = false
# Loguru 最低输出级别
LOGURU_LEVEL = 'INFO'
# 是否输出到 stdout
LOGURU_STDOUT = true
# 是否启用文件日志
LOG_FILE_ENABLED = true
# 文件日志根目录
LOG_FILE_BASE_DIR = 'logs'
# 文件滚动策略
LOGURU_ROTATION = '50MB'
# 文件保留策略
LOGURU_RETENTION = '30 days'
# 文件压缩格式
LOGURU_COMPRESSION = 'zip'
# 实例标识(用于区分实例)
LOG_INSTANCE_ID = 'dockerpg'
# 服务名称(用于统一标识服务)
LOG_SERVICE_NAME = 'ruoyi-fastapi-backend'
# Worker 标识(auto 自动生成)
LOG_WORKER_ID = 'auto'
# -------- 统一认证中心 OIDC 配置 --------
# 默认关闭;启用前必须配置生产密钥、Pepper 和已注册 Origin。
# 是否启用统一认证中心 OIDC 功能
OIDC_ENABLED = false
# OIDC 签发者地址(必须为公开的绝对 URL)
OIDC_ISSUER = 'https://auth.example.com'
# OIDC 对外公开基址,须与 OIDC_ISSUER 一致
OIDC_PUBLIC_BASE_URL = 'https://auth.example.com'
# 是否强制所有授权请求使用 PKCE
OIDC_REQUIRE_PKCE = true
# 允许的 PKCE 方法,多个值使用逗号分隔(当前仅支持 S256)
OIDC_PKCE_METHODS = 'S256'
# 校验令牌时间戳时允许的时钟偏差(秒)
OIDC_ALLOWED_CLOCK_SKEW_SECONDS = 60
# 授权码有效期(秒)
OIDC_AUTHORIZATION_CODE_TTL_SECONDS = 90
# 登录、同意等交互状态有效期(秒)
OIDC_INTERACTION_TTL_SECONDS = 300
# ID Token 有效期(秒)
OIDC_ID_TOKEN_TTL_SECONDS = 300
# Access Token 默认有效期(秒)
OIDC_ACCESS_TOKEN_TTL_SECONDS = 600
# Access Token 允许的最大有效期(秒)
OIDC_MAX_ACCESS_TOKEN_TTL_SECONDS = 1800
# Refresh Token 闲置有效期(秒)
OIDC_REFRESH_TOKEN_IDLE_SECONDS = 604800
# Refresh Token 绝对有效期(秒)
OIDC_REFRESH_TOKEN_ABSOLUTE_SECONDS = 2592000
# SSO 会话闲置超时时间(秒)
OIDC_SSO_IDLE_SECONDS = 1800
# SSO 会话绝对有效期(秒)
OIDC_SSO_ABSOLUTE_SECONDS = 28800
# SSO“记住我”模式的绝对有效期(秒)
OIDC_SSO_REMEMBER_ABSOLUTE_SECONDS = 604800
# OIDC 签名算法
OIDC_SIGNING_ALGORITHM = 'RS256'
# 签名密钥来源,可选 file、kms、hsm
OIDC_SIGNING_KEY_SOURCE = 'file'
# 签名私钥文件路径(file 模式使用)
OIDC_SIGNING_PRIVATE_KEY_PATH = ''
# 签名私钥加密密钥
OIDC_SIGNING_KEY_ENCRYPTION_KEY = ''
# 当前启用的签名密钥 KID,留空由数据库 active 密钥决定
OIDC_ACTIVE_KID = ''
# 密钥轮换期间旧密钥保留时间(秒)
OIDC_KEY_ROTATION_OVERLAP_SECONDS = 86400
# 不透明 Token 哈希 Pepper(至少 32 bytes,生产环境必须配置)
OIDC_TOKEN_HASH_PEPPER = ''
# 允许的 CORS Origin 列表,多个值使用逗号分隔
OIDC_CORS_ALLOWED_ORIGINS = ''
# 登录交互页面 URL
OIDC_INTERACTION_LOGIN_URL = 'https://auth.example.com/auth-center/login'
# 授权同意页面 URL
OIDC_INTERACTION_CONSENT_URL = 'https://auth.example.com/auth-center/consent'
# 交互错误页面 URL
OIDC_INTERACTION_ERROR_URL = 'https://auth.example.com/auth-center/error'
# SSO Cookie 名称(必须使用 __Host- 前缀)
OIDC_SSO_COOKIE_NAME = '__Host-ruoyi-sso'
# SSO Cookie 是否启用 Secure 属性
OIDC_SSO_COOKIE_SECURE = true
# SSO Cookie SameSite 策略(当前必须为 lax)
OIDC_SSO_COOKIE_SAMESITE = 'lax'
# SSO Cookie Domain(__Host- Cookie 必须留空)
OIDC_SSO_COOKIE_DOMAIN = ''
# 是否启用 Legacy 认证隔离
OIDC_LEGACY_AUTH_ISOLATION_ENABLED = true
# 审计日志保留天数
OIDC_AUDIT_RETENTION_DAYS = 180
# Back-channel Logout 请求超时时间(秒)
OIDC_BACKCHANNEL_LOGOUT_TIMEOUT_SECONDS = 5
# -------- 传输层加解密配置 --------
# 是否启用传输层加解密
TRANSPORT_CRYPTO_ENABLED = true
# 传输层加解密模式:off=关闭,optional=明文/密文兼容,required=命中接口强制加密
TRANSPORT_CRYPTO_MODE = 'optional'
# 传输层加解密算法标识
TRANSPORT_CRYPTO_ALGORITHM = 'RSA_OAEP_AES_256_GCM'
# 当前启用的密钥版本标识
TRANSPORT_CRYPTO_KID = 'default'
# 传输层RSA位数,需与下方密钥对匹配
TRANSPORT_CRYPTO_RSA_KEY_SIZE = 4096
# 传输层公钥,默认提供一套可用示例值;Docker 部署前请替换为正式密钥
TRANSPORT_CRYPTO_PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAwA2ooWpsxLzIVMJp7Wcv\nvR0Bu8paFn8NVPpzz+wGpUlwP5DGK6pBGItsglNMZx56MSYMp3zVyqB95XUVZ6Ub\nQVyHJ6BXXIMs/BpzcHCbyXR/wWG+pKxQ8UEwaHVhK8X21xW1R0kzzwhgMw51unEs\nA81kskVlDdGeNyaOJg5QuofEErCfR1y0e+iqd1PBpIwdEY5L+BzvbVtyhsPz6dBu\n9YbEbKs7JvNle5vjc72ebbMIeGejHFQRYxihuamPCAEylj1qqpHk8U+r+3icxQsj\n8F/TySLuOy37iVWfD+5ikLyou4ZDI3hOYnIYHl194ZM5xVyOGBD/xdqZadXTLqL6\nSrldwZfZDBl3EGgRby8yJqO6SqGgyvyGWXZAaHoPMmF+quu/nUooqnp0fpl+LCqX\nhK67kbYaA9xJeHRaP04cg16imB7sBIXBqzkyZtkhC2BtlL0h5X7dRlAddrQ23z6d\nWdJA3qe3iBSSM8pmedv+Jgfau/PFam2051HqFxvJEh/jnc6rq1aIjL/d4Kk5imIa\nQ6acv+v5N6QVFptlcx6I7j8yZJ7WUHZlB1IxVqfPb69+985eknZyLul60gyu0kPG\nYUecypUu2wiNDBAErZlUxEujMWgJDFYCSonHxtwr88gDInjP0lvwd/OgqjDQ7hSo\nRYxPhTbwo68RJDpImBjn+YsCAwEAAQ==\n-----END PUBLIC KEY-----'
# 传输层私钥,必须与上方公钥成对使用;Docker 部署前请替换为正式密钥
TRANSPORT_CRYPTO_PRIVATE_KEY = '-----BEGIN RSA PRIVATE KEY-----\n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\n-----END RSA PRIVATE KEY-----'
# 历史密钥对配置,JSON数组格式,密钥轮换说明见 docs/transport_crypto_deployment.md
TRANSPORT_CRYPTO_LEGACY_KEY_PAIRS = '[]'
# 公钥缓存有效期(秒)
TRANSPORT_CRYPTO_PUBLIC_KEY_TTL_SECONDS = 3600
# 前端传输加密策略缓存有效期(秒)
TRANSPORT_CRYPTO_FRONTEND_CONFIG_TTL_SECONDS = 300
# GET/DELETE 请求参数加密后的最大 URL 长度
TRANSPORT_CRYPTO_MAX_GET_URL_LENGTH = 4096
# 请求时间窗允许偏差(秒)
TRANSPORT_CRYPTO_CLOCK_SKEW_SECONDS = 120
# 防重放随机数有效期(秒)
TRANSPORT_CRYPTO_REPLAY_TTL_SECONDS = 300
# 启用传输层加密的路径列表,多个值使用逗号分隔,留空表示默认全部启用
TRANSPORT_CRYPTO_ENABLED_PATHS = ''
# 强制要求传输层加密的路径列表,多个值使用逗号分隔
TRANSPORT_CRYPTO_REQUIRED_PATHS = ''
# 排除传输层加密的路径列表,多个值使用逗号分隔
TRANSPORT_CRYPTO_EXCLUDE_PATHS = '/openapi.json,/docs,/docs/oauth2-redirect,/redoc,/transport/crypto/frontend-config,/transport/crypto/public-key,/common/download,/common/download/resource,/common/files,/system/file/download,/.well-known/openid-configuration,/.well-known/oauth-authorization-server,/oauth2/authorize,/oauth2/token,/oauth2/userinfo,/oauth2/jwks,/oauth2/revoke,/oauth2/introspect,/oauth2/logout'
# -------- 插件依赖安装策略配置 --------
# 策略模式:可填单一模式,或按环境映射。可选 disabled、plan_only、explicit、locked、offline
PLUGIN_DEPENDENCY_POLICY_MODE = 'dev=explicit,test=plan_only,stage=locked,prod=plan_only'
# 生产环境是否允许真实安装插件声明的 Python/npm 依赖
PLUGIN_DEPENDENCY_ALLOW_PROD_INSTALL = false
# 执行真实安装时是否要求显式确认
PLUGIN_DEPENDENCY_REQUIRE_YES = true
# Docker 生产环境默认要求依赖命中允许列表
PLUGIN_DEPENDENCY_REQUIRE_ALLOWLIST = true
# Docker 生产环境默认要求锁文件
PLUGIN_DEPENDENCY_REQUIRE_LOCKFILE = true
# 默认锁文件路径,CLI --lockfile 会覆盖该值
PLUGIN_DEPENDENCY_LOCKFILE = ''
# 默认允许列表路径
PLUGIN_DEPENDENCY_ALLOWLIST = ''
# 离线制品根目录
PLUGIN_DEPENDENCY_OFFLINE_DIR = ''
# 受控 PyPI 镜像地址,留空表示不改写 pip 安装参数
PLUGIN_DEPENDENCY_PIP_INDEX_URL = ''
# 受控 npm registry 地址,留空表示不改写 npm 安装参数
PLUGIN_DEPENDENCY_NPM_REGISTRY = ''
# 单条依赖安装命令超时时间(秒)
PLUGIN_DEPENDENCY_INSTALL_TIMEOUT = 600