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
@@ -0,0 +1,39 @@
"""去多身份:drop user_identities
Revision ID: 0014_drop_user_identities
Revises: 0013_opc_cert_park_transfer
Create Date: 2026-08-26
"""
from __future__ import annotations
from alembic import op
revision = "0014_drop_user_identities"
down_revision = "0013_opc_cert_park_transfer"
branch_labels = None
depends_on = None
def upgrade() -> None:
# 账号单一角色(去多身份/多端口):user_identities 不再使用,删除表。
op.drop_table("user_identities")
def downgrade() -> None:
# 降级:重建 user_identities(结构由模型决定,这里按原 models 恢复)。
import sqlalchemy as sa
op.create_table(
"user_identities",
sa.Column("id", sa.String(), primary_key=True),
sa.Column("user_id", sa.String(), sa.ForeignKey("users.id", ondelete="CASCADE"), nullable=False),
sa.Column("port", sa.String(), default="opc"),
sa.Column("role", sa.String(), default="opc_member"),
sa.Column("sub_role", sa.String(), nullable=True),
sa.Column("name", sa.String(), default=""),
sa.Column("org_id", sa.String(), sa.ForeignKey("organizations.id"), nullable=True),
sa.Column("region_id", sa.String(), sa.ForeignKey("regions.id"), nullable=True),
sa.Column("status", sa.String(), default="active"),
sa.Column("created_at", sa.String(), default=""),
sa.Column("updated_at", sa.String(), default=""),
)