fix: 对OIDC获取的部门名称和描述进行清理和长度校验

This commit is contained in:
Your Name 2026-04-16 10:05:25 +08:00
parent 5044243f40
commit 90de80600d

View File

@ -54,6 +54,7 @@ class OIDCConfig(BaseModel):
use_raw_username: bool = Field(default=False, description="是否使用原始用户名不带oidc前缀")
fetch_department_info: bool = Field(default=False, description="是否从OIDC中获取部门信息")
department_claim: str = Field(default="department", description="部门信息映射字段")
force_prompt_login: bool = Field(default=True, description="是否强制用户重新登录添加prompt=login参数")
@classmethod
def from_env(cls) -> "OIDCConfig":
@ -416,31 +417,56 @@ class OIDCUtils:
async def get_or_create_oidc_department(db, dept_name_from_oidc: str | None = None, dept_desc_from_oidc: str | None = None) -> Department | None:
"""获取或创建 OIDC 用户的部门"""
# 优先使用从 OIDC 获取的部门名称,否则使用默认部门名称
dept_name = dept_name_from_oidc or oidc_config.default_department
# 清理并验证从 OIDC 获取的部门名称
processed_dept_name = None
processed_dept_desc = None
result = await db.execute(select(Department).filter(Department.name == dept_name))
if dept_name_from_oidc:
# 去除首尾空格
processed_dept_name = dept_name_from_oidc.strip()
# 截断到 50 字符(匹配数据库限制)
if len(processed_dept_name) > 50:
processed_dept_name = processed_dept_name[:50]
# 如果处理后为空,放弃使用
if not processed_dept_name:
processed_dept_name = None
# 清理并验证从 OIDC 获取的部门描述
if dept_desc_from_oidc:
processed_dept_desc = dept_desc_from_oidc.strip()
# 截断到 255 字符(匹配数据库限制)
if len(processed_dept_desc) > 255:
processed_dept_desc = processed_dept_desc[:255]
if not processed_dept_desc:
processed_dept_desc = None
# 最终确定部门名称优先使用处理后的OIDC部门名称否则使用默认部门名称
final_dept_name = processed_dept_name or oidc_config.default_department
# 最终确定部门描述优先使用处理后的OIDC部门描述否则使用默认描述
final_dept_desc = processed_dept_desc or f"{final_dept_name}部门"
result = await db.execute(select(Department).filter(Department.name == final_dept_name))
dept = result.scalar_one_or_none()
if dept:
# 部门已存在,直接返回
logger.info(f"Using existing department: {dept_name}")
logger.info(f"Using existing department: {final_dept_name}")
return dept
# 部门不存在,创建新部门
dept = Department(
name=dept_name,
description=dept_desc_from_oidc or f"{dept_name}部门",
name=final_dept_name,
description=final_dept_desc,
)
db.add(dept)
try:
await db.commit()
await db.refresh(dept)
logger.info(f"Created OIDC department: {dept_name}")
logger.info(f"Created OIDC department: {final_dept_name}")
except IntegrityError:
# 并发创建时部门可能已存在,再次查询
await db.rollback()
result = await db.execute(select(Department).filter(Department.name == dept_name))
result = await db.execute(select(Department).filter(Department.name == final_dept_name))
dept = result.scalar_one_or_none()
return dept