refactor(auth): 去多身份/多端口——账号单一角色,删 user_identities/select-identity/多端口路由

- 删 UserIdentity 模型/IdentityRepository/db.identities,账号统一单一角色(users.role)
- auth.py 去 select-identity/_identity_summaries,登录恒返回 identities=[];_login_response_for_user 按单角色签发
- 删多端口路由 rbac_government/investor/developer 及其 main 挂载
- seed 去多身份回填(_migrate_identities/_ensure_port_agents/多端身份/端口标签映射)
- dependencies: require_port 去端口隔离(单角色放宽)、optional_current_user 修 identity_id 多余参数
- user_admin_service create_user 不再建端口身份;schemas 去 SelectIdentityRequest
- 新增迁移 0014_drop_user_identities(drop user_identities 表)
- 测试改写为单角色契约(登录空 identities、无 select-identity、账号级智能体)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Pine
2026-08-26 19:15:51 +08:00
parent 97f0a0698c
commit ac2df72b21
14 changed files with 91 additions and 843 deletions
+7 -4
View File
@@ -83,11 +83,14 @@ async def optional_current_user(
user = await db.users.get_by_id(payload.get("sub"))
if user is None or user.get("status") != "active":
return None
return await _resolve_identity(user, payload.get("identity_id"), db)
return await _resolve_identity(user, db)
def require_port(user: dict = Depends(get_current_user)) -> dict:
"""按端口隔离的资源(如智能体):必须已解析出端口身份,否则 403。"""
if not user.get("port"):
raise HTTPException(status_code=403, detail="请先选择身份/端口")
"""按端口隔离的资源(如智能体)—— 单角色后不再按端口隔离,仅要求已登录。
账号唯一角色:智能体不再按端口隔离,统一归到该账号(port="")。为兼容
既有 AgentRepository 的 port 过滤,这里补一个恒定空串。
"""
user.setdefault("port", "")
return user