From dcb0db8275ff3adb2ddd1b03440b82bff440f6b9 Mon Sep 17 00:00:00 2001 From: long <452591453@qq.com> Date: Thu, 29 Oct 2026 17:34:55 +0800 Subject: [PATCH] feat(iam): add guarded identity management and ERP launch source --- admin/src/api/iam-v2.ts | 37 ++ admin/src/components/iam-v2/launch.vue | 32 + admin/src/components/iam-v2/personal.vue | 129 ++++ .../default/components/header/index.vue | 2 + admin/src/views/permission/identity/index.vue | 601 ++++++++++++++++++ admin/src/views/user/setting.vue | 2 + docs/iam-v2.md | 65 ++ scripts/test-iam-v2.sh | 14 + .../adminapi/controller/IamV2Controller.php | 185 ++++++ .../adminapi/controller/LoginController.php | 13 +- .../http/middleware/LoginMiddleware.php | 14 + server/app/adminapi/logic/LoginLogic.php | 8 +- server/app/adminapi/route/app.php | 23 + .../service/iam/IamAccountProvisioner.php | 4 + .../adminapi/service/iam/IamLoginService.php | 9 +- .../adminapi/service/iam/IamOidcClient.php | 8 + .../adminapi/service/iam/v2/IamV2Client.php | 68 ++ .../adminapi/service/iam/v2/IamV2Events.php | 37 ++ .../app/adminapi/service/iam/v2/IamV2Flow.php | 36 ++ .../adminapi/service/iam/v2/IamV2Manager.php | 168 +++++ .../adminapi/service/iam/v2/IamV2Source.php | 153 +++++ server/config/iam.php | 6 + .../database/migrations/20261029_iam_v2.sql | 59 ++ server/tests/IamV2RouteContractTest.php | 24 + server/tests/IamV2SourceTest.php | 104 +++ server/tests/IamV2UiTest.mjs | 31 + 26 files changed, 1827 insertions(+), 5 deletions(-) create mode 100644 admin/src/api/iam-v2.ts create mode 100644 admin/src/components/iam-v2/launch.vue create mode 100644 admin/src/components/iam-v2/personal.vue create mode 100644 admin/src/views/permission/identity/index.vue create mode 100644 docs/iam-v2.md create mode 100755 scripts/test-iam-v2.sh create mode 100644 server/app/adminapi/controller/IamV2Controller.php create mode 100644 server/app/adminapi/route/app.php create mode 100644 server/app/adminapi/service/iam/v2/IamV2Client.php create mode 100644 server/app/adminapi/service/iam/v2/IamV2Events.php create mode 100644 server/app/adminapi/service/iam/v2/IamV2Flow.php create mode 100644 server/app/adminapi/service/iam/v2/IamV2Manager.php create mode 100644 server/app/adminapi/service/iam/v2/IamV2Source.php create mode 100644 server/database/migrations/20261029_iam_v2.sql create mode 100644 server/tests/IamV2RouteContractTest.php create mode 100644 server/tests/IamV2SourceTest.php create mode 100644 server/tests/IamV2UiTest.mjs diff --git a/admin/src/api/iam-v2.ts b/admin/src/api/iam-v2.ts new file mode 100644 index 000000000..b4bf71a57 --- /dev/null +++ b/admin/src/api/iam-v2.ts @@ -0,0 +1,37 @@ +import request from '@/utils/request' +export type IdentityOperation = { + kind: 'bind' | 'create_and_bind' | 'unbind' | 'rebind' | 'reconcile' + user_id: number + employee_id?: string + expected_version?: number + new_employee?: { username: string; display_name: string; email?: string } + reason: string +} +const prefix = '/iam/v2' +const opts = { isOpenRetry: false, ignoreCancelToken: true } +export const iamGet = (path: string, params?: Record): Promise => + request.get({ url: prefix + path, params, withCredentials: true }, opts) +export const iamPost = ( + path: string, + params: Record = {}, + key = crypto.randomUUID() +): Promise => + request.post( + { url: prefix + path, params, headers: { 'Idempotency-Key': key }, withCredentials: true }, + opts + ) +export const identityError = (e: any): string => + ({ + REAUTH_REQUIRED: '请先验证当前账号密码,或通过企业微信重新登录。', + ACCOUNT_MISMATCH: '两端账号不一致,请确认身份后重新发起。', + NOT_LINKED: '当前账号还未关联 IAM。', + NOT_AUTHORIZED: 'IAM 尚未授予目标应用访问权限。', + BINDING_CONFLICT: '关联已变更,请刷新后重新确认。', + PROTECTED_ACCOUNT_REVIEW_REQUIRED: '敏感账号需要双侧近期管理员核验,请由统一身份平台审核。', + SERVICE_UNAVAILABLE: '统一身份服务暂时不可用,状态未确认,请稍后重试。', + FEATURE_DISABLED: 'IAM 关联管理尚未启用。', + FORBIDDEN: '没有当前操作权限或目标超出数据范围。', + TRANSACTION_EXPIRED: '验证已过期或已经使用,请重新发起。' + })[e?.error?.code as string] || + e?.error?.code || + '操作未完成,请刷新状态后重试。' diff --git a/admin/src/components/iam-v2/launch.vue b/admin/src/components/iam-v2/launch.vue new file mode 100644 index 000000000..4fc0b1262 --- /dev/null +++ b/admin/src/components/iam-v2/launch.vue @@ -0,0 +1,32 @@ + + diff --git a/admin/src/components/iam-v2/personal.vue b/admin/src/components/iam-v2/personal.vue new file mode 100644 index 000000000..68960a9c8 --- /dev/null +++ b/admin/src/components/iam-v2/personal.vue @@ -0,0 +1,129 @@ + + diff --git a/admin/src/layout/default/components/header/index.vue b/admin/src/layout/default/components/header/index.vue index d73d38ce8..807d92d9e 100644 --- a/admin/src/layout/default/components/header/index.vue +++ b/admin/src/layout/default/components/header/index.vue @@ -22,6 +22,7 @@
+