feat: 添加 OAuth 认证支持及相关改进

- 新增 OAuth 模块,支持 LinuxDo/GitHub/Google 等第三方登录
- 用户邮箱改为可选字段,支持无邮箱注册
- 新增模块配置验证状态 (config_validated/config_error)
- 系统设置界面改为分块独立保存
- 用户设置新增 OAuth 绑定管理和首次密码设置
- 登录界面支持 OAuth 按钮展示
- 邮箱验证设置移至邮件设置页面
This commit is contained in:
fawney19
2026-01-19 03:19:17 +08:00
parent e2e14fd09c
commit 3d88dfd98a
61 changed files with 4548 additions and 950 deletions

View File

@@ -4,6 +4,8 @@ LDAP 认证模块
提供 LDAP/Active Directory 用户认证支持
"""
from typing import TYPE_CHECKING, Tuple
from src.core.modules.base import (
ModuleCategory,
ModuleDefinition,
@@ -11,6 +13,9 @@ from src.core.modules.base import (
ModuleMetadata,
)
if TYPE_CHECKING:
from sqlalchemy.orm import Session
def _get_router():
"""延迟导入路由(避免启动时加载重依赖)"""
@@ -26,6 +31,46 @@ async def _health_check() -> ModuleHealth:
return ModuleHealth.UNKNOWN
def _validate_config(db: "Session") -> Tuple[bool, str]:
"""
验证 LDAP 配置是否可以启用模块
检查项:
1. 配置是否存在
2. 必填字段是否完整
3. 绑定密码是否可解密
注意:不在此处执行连接测试,因为 validate_config 会在每次查询模块状态时调用,
同步阻塞等待 LDAP 服务器响应会严重影响性能。连接测试应在专门的测试接口中进行。
"""
from src.core.crypto import crypto_service
from src.models.database import LDAPConfig
config = db.query(LDAPConfig).first()
if not config:
return False, "请先配置 LDAP 连接信息"
# 检查必填字段
if not config.server_url:
return False, "请配置 LDAP 服务器地址"
if not config.bind_dn:
return False, "请配置绑定 DN"
if not config.base_dn:
return False, "请配置搜索基准 DN"
if not config.bind_password_encrypted:
return False, "请配置绑定密码"
# 尝试解密密码(仅验证可解密,不执行连接测试)
try:
bind_password = crypto_service.decrypt(config.bind_password_encrypted)
if not bind_password:
return False, "绑定密码为空,请重新设置"
except Exception:
return False, "绑定密码解密失败,请重新设置"
return True, ""
# LDAP 模块定义
ldap_module = ModuleDefinition(
metadata=ModuleMetadata(
@@ -47,4 +92,5 @@ ldap_module = ModuleDefinition(
),
router_factory=_get_router,
health_check=_health_check,
validate_config=_validate_config,
)