From 1ec2feee4753ff73b8169fa53705e55d57ec0ee8 Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Wed, 23 Sep 2026 02:08:13 +0800 Subject: [PATCH] fix: keep only tenant realname review policy --- docs/third/IM-阿里云实名认证接入方案.md | 16 ++++------------ docs/third/IM-阿里云实名认证租户配置字段SQL.sql | 9 ++------- server/db/mysql/adapter.go | 4 ---- server/db/mysql/realname_policy_config.go | 6 +----- server/im_http_test.go | 5 +---- server/store/store.go | 3 --- server/store/types/security.go | 10 ---------- 7 files changed, 8 insertions(+), 45 deletions(-) diff --git a/docs/third/IM-阿里云实名认证接入方案.md b/docs/third/IM-阿里云实名认证接入方案.md index 719503c..75e831f 100644 --- a/docs/third/IM-阿里云实名认证接入方案.md +++ b/docs/third/IM-阿里云实名认证接入方案.md @@ -160,15 +160,11 @@ AccessKey 建议使用最小权限 RAM 子账号,只授权实人认证相关 OpenAPI。生产环境如果后续接入 KMS/Secrets Manager,`hg_sys_config` 中可只保存密钥引用。 -租户审核策略建议扩展 `hotgo.im_tenant_config`: +租户审核策略使用 `hotgo.im_tenant.realname_review_policy`: | 字段 | 默认值 | 说明 | | --- | --- | --- | | `realname_review_policy` | `0` | 审核方式:`0=不审核`,`1=自动审核;自动审核失败/异常/不确定时进入人工审核` | -| `realname_provider_mode` | `id_card_2factor` | 第三方核验模式:`id_card_2factor` 或 `smart_verify` | -| `realname_required` | `0` | 是否强制实名,影响 `bootstrap.security.realname.required` 和受限写操作 | -| `realname_allow_skip` | `1` | 未实名提醒是否允许跳过 | -| `realname_remind_after` | `24h` | 客户端实名提醒间隔 | 执行规则: @@ -430,15 +426,11 @@ SELECT 'im_realname', '实名认证回调密钥', 'string', 'callback_secret', ' WHERE NOT EXISTS (SELECT 1 FROM hg_sys_config WHERE `group`='im_realname' AND `key`='callback_secret'); ``` -HotGo 控制库增加租户级审核策略。以下写法用于现有库变更,正式发布时可合并到 `im_tenant_config` 建表 SQL: +HotGo 控制库增加租户级审核策略。以下写法用于现有库变更,正式发布时可合并到 `im_tenant` 建表 SQL: ```sql -ALTER TABLE hotgo.im_tenant_config - ADD COLUMN realname_review_policy TINYINT(1) NOT NULL DEFAULT 0 COMMENT '实名审核策略:0不审核,1自动审核且失败转人工' AFTER max_group_members, - ADD COLUMN realname_provider_mode VARCHAR(32) NOT NULL DEFAULT 'id_card_2factor' COMMENT 'id_card_2factor 或 smart_verify' AFTER realname_review_policy, - ADD COLUMN realname_required TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否强制实名' AFTER realname_provider_mode, - ADD COLUMN realname_allow_skip TINYINT(1) NOT NULL DEFAULT 1 COMMENT '未实名提醒是否允许跳过' AFTER realname_required, - ADD COLUMN realname_remind_after VARCHAR(32) NOT NULL DEFAULT '24h' COMMENT '实名提醒间隔' AFTER realname_allow_skip; +ALTER TABLE hotgo.im_tenant + ADD COLUMN realname_review_policy TINYINT(1) NOT NULL DEFAULT 0 COMMENT '实名审核策略:0不审核,1自动审核且失败转人工' AFTER max_group_members; ``` 默认值要求: diff --git a/docs/third/IM-阿里云实名认证租户配置字段SQL.sql b/docs/third/IM-阿里云实名认证租户配置字段SQL.sql index 7509a04..01424f6 100644 --- a/docs/third/IM-阿里云实名认证租户配置字段SQL.sql +++ b/docs/third/IM-阿里云实名认证租户配置字段SQL.sql @@ -3,11 +3,6 @@ -- 说明: -- 1. realname_review_policy=0:不自动审核,实名提交进入 pending,等待后台人工审核。 -- 2. realname_review_policy=1:自动调用阿里云审核,通过写 verified;失败、异常、不确定写 manual_review,等待人工复核。 --- 3. realname_provider_mode 只表示阿里云核验模式,不承担审核开关含义。 -ALTER TABLE hotgo.im_tenant_config - ADD COLUMN realname_review_policy TINYINT(1) NOT NULL DEFAULT 0 COMMENT '实名审核策略:0不审核,1自动审核且失败转人工' AFTER max_group_members, - ADD COLUMN realname_provider_mode VARCHAR(32) NOT NULL DEFAULT 'id_card_2factor' COMMENT 'id_card_2factor 或 smart_verify' AFTER realname_review_policy, - ADD COLUMN realname_required TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否强制实名' AFTER realname_provider_mode, - ADD COLUMN realname_allow_skip TINYINT(1) NOT NULL DEFAULT 1 COMMENT '未实名提醒是否允许跳过' AFTER realname_required, - ADD COLUMN realname_remind_after VARCHAR(32) NOT NULL DEFAULT '24h' COMMENT '实名提醒间隔' AFTER realname_allow_skip; +ALTER TABLE hotgo.im_tenant + ADD COLUMN realname_review_policy TINYINT(1) NOT NULL DEFAULT 0 COMMENT '实名审核策略:0不审核,1自动审核且失败转人工' AFTER max_group_members; diff --git a/server/db/mysql/adapter.go b/server/db/mysql/adapter.go index 0d6b5fc..45add0b 100644 --- a/server/db/mysql/adapter.go +++ b/server/db/mysql/adapter.go @@ -562,10 +562,6 @@ func createTenantRegistry(tx *sql.Tx, registryDB, _ string) error { max_groups BIGINT UNSIGNED NOT NULL DEFAULT 0, max_group_members INT UNSIGNED NOT NULL DEFAULT 0, realname_review_policy TINYINT(1) NOT NULL DEFAULT 0, - realname_provider_mode VARCHAR(32) NOT NULL DEFAULT 'id_card_2factor', - realname_required TINYINT(1) NOT NULL DEFAULT 0, - realname_allow_skip TINYINT(1) NOT NULL DEFAULT 1, - realname_remind_after VARCHAR(32) NOT NULL DEFAULT '24h', aliyun_moderation_enabled TINYINT(1) NOT NULL DEFAULT 0, local_moderation_enabled TINYINT(1) NOT NULL DEFAULT 0, message_encryption_enabled TINYINT(1) NOT NULL DEFAULT 0, diff --git a/server/db/mysql/realname_policy_config.go b/server/db/mysql/realname_policy_config.go index a5c1e1c..1c6c4ff 100644 --- a/server/db/mysql/realname_policy_config.go +++ b/server/db/mysql/realname_policy_config.go @@ -28,8 +28,7 @@ func (a *adapter) RealNamePolicy(tenantID t.TenantID) (*t.RealNamePolicy, error) var policy t.RealNamePolicy // 商户配置已并入 im_tenant(manager 仓库 im_tenant_merge_config.sql),实名政策兜底直查切到 im_tenant; // id AS tenant_id 保持扫描列名不变,ErrNoRows/未知列仍回退默认值,兼容阶段一迁移未执行的滚动发布窗口 - err := db.GetContext(ctx, &policy, `SELECT id AS tenant_id, realname_review_policy, realname_provider_mode, - realname_required, realname_allow_skip, realname_remind_after + err := db.GetContext(ctx, &policy, `SELECT id AS tenant_id, realname_review_policy FROM im_tenant WHERE id=? LIMIT 1`, tenantID) if errors.Is(err, sql.ErrNoRows) { policy = *defaultRealNamePolicy(tenantID) @@ -50,9 +49,6 @@ func defaultRealNamePolicy(tenantID t.TenantID) *t.RealNamePolicy { policy := &t.RealNamePolicy{ TenantID: tenantID, ReviewPolicy: t.RealNameReviewPolicyNone, - ProviderMode: "id_card_2factor", - AllowSkip: true, - RemindAfter: "24h", } policy.Normalize() return policy diff --git a/server/im_http_test.go b/server/im_http_test.go index ae7a9dd..f5cde7b 100644 --- a/server/im_http_test.go +++ b/server/im_http_test.go @@ -236,7 +236,7 @@ func (s testRealNameConfigStore) Policy(tenantID types.TenantID) (*types.RealNam return nil, s.err } if s.policy == nil { - return &types.RealNamePolicy{TenantID: tenantID, ReviewPolicy: types.RealNameReviewPolicyNone, ProviderMode: "id_card_2factor", AllowSkip: true, RemindAfter: "24h"}, nil + return &types.RealNamePolicy{TenantID: tenantID, ReviewPolicy: types.RealNameReviewPolicyNone}, nil } policy := *s.policy policy.TenantID = tenantID @@ -2182,9 +2182,6 @@ func TestServeIMRealNameSubmissionAutoReviewFallsBackToManual(t *testing.T) { store.Security = security store.RealNameConfig = testRealNameConfigStore{policy: &types.RealNamePolicy{ ReviewPolicy: types.RealNameReviewPolicyAutoManual, - ProviderMode: "id_card_2factor", - AllowSkip: true, - RemindAfter: "24h", }} store.ThirdPartyConfig = testThirdPartyConfigStore{} defer func() { diff --git a/server/store/store.go b/server/store/store.go index 63053d0..a6d2055 100644 --- a/server/store/store.go +++ b/server/store/store.go @@ -417,9 +417,6 @@ func defaultRealNamePolicy(tenantID types.TenantID) *types.RealNamePolicy { policy := &types.RealNamePolicy{ TenantID: tenantID, ReviewPolicy: types.RealNameReviewPolicyNone, - ProviderMode: "id_card_2factor", - AllowSkip: true, - RemindAfter: "24h", } policy.Normalize() return policy diff --git a/server/store/types/security.go b/server/store/types/security.go index d6bba7d..0c87b32 100644 --- a/server/store/types/security.go +++ b/server/store/types/security.go @@ -11,20 +11,10 @@ const ( type RealNamePolicy struct { TenantID TenantID `db:"tenant_id" json:"tenant_id"` ReviewPolicy int `db:"realname_review_policy" json:"realname_review_policy"` - ProviderMode string `db:"realname_provider_mode" json:"realname_provider_mode"` - Required bool `db:"realname_required" json:"realname_required"` - AllowSkip bool `db:"realname_allow_skip" json:"realname_allow_skip"` - RemindAfter string `db:"realname_remind_after" json:"realname_remind_after"` } // Normalize fills defaults and clamps unsupported enum values. func (p *RealNamePolicy) Normalize() { - if p.ProviderMode == "" { - p.ProviderMode = "id_card_2factor" - } - if p.RemindAfter == "" { - p.RemindAfter = "24h" - } if p.ReviewPolicy != RealNameReviewPolicyAutoManual { p.ReviewPolicy = RealNameReviewPolicyNone }