fix: 对OIDC获取的部门名称和描述进行清理和长度校验
This commit is contained in:
parent
5044243f40
commit
90de80600d
@ -54,6 +54,7 @@ class OIDCConfig(BaseModel):
|
|||||||
use_raw_username: bool = Field(default=False, description="是否使用原始用户名(不带oidc前缀)")
|
use_raw_username: bool = Field(default=False, description="是否使用原始用户名(不带oidc前缀)")
|
||||||
fetch_department_info: bool = Field(default=False, description="是否从OIDC中获取部门信息")
|
fetch_department_info: bool = Field(default=False, description="是否从OIDC中获取部门信息")
|
||||||
department_claim: str = Field(default="department", description="部门信息映射字段")
|
department_claim: str = Field(default="department", description="部门信息映射字段")
|
||||||
|
force_prompt_login: bool = Field(default=True, description="是否强制用户重新登录(添加prompt=login参数)")
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_env(cls) -> "OIDCConfig":
|
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:
|
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 用户的部门"""
|
||||||
# 优先使用从 OIDC 获取的部门名称,否则使用默认部门名称
|
# 清理并验证从 OIDC 获取的部门名称
|
||||||
dept_name = dept_name_from_oidc or oidc_config.default_department
|
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()
|
dept = result.scalar_one_or_none()
|
||||||
|
|
||||||
if dept:
|
if dept:
|
||||||
# 部门已存在,直接返回
|
# 部门已存在,直接返回
|
||||||
logger.info(f"Using existing department: {dept_name}")
|
logger.info(f"Using existing department: {final_dept_name}")
|
||||||
return dept
|
return dept
|
||||||
|
|
||||||
# 部门不存在,创建新部门
|
# 部门不存在,创建新部门
|
||||||
dept = Department(
|
dept = Department(
|
||||||
name=dept_name,
|
name=final_dept_name,
|
||||||
description=dept_desc_from_oidc or f"{dept_name}部门",
|
description=final_dept_desc,
|
||||||
)
|
)
|
||||||
db.add(dept)
|
db.add(dept)
|
||||||
try:
|
try:
|
||||||
await db.commit()
|
await db.commit()
|
||||||
await db.refresh(dept)
|
await db.refresh(dept)
|
||||||
logger.info(f"Created OIDC department: {dept_name}")
|
logger.info(f"Created OIDC department: {final_dept_name}")
|
||||||
except IntegrityError:
|
except IntegrityError:
|
||||||
# 并发创建时部门可能已存在,再次查询
|
# 并发创建时部门可能已存在,再次查询
|
||||||
await db.rollback()
|
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()
|
dept = result.scalar_one_or_none()
|
||||||
|
|
||||||
return dept
|
return dept
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user