fix: keep only tenant realname review policy

This commit is contained in:
richjohnrambo
2026-09-23 02:08:13 +08:00
parent 62856194e5
commit 1ec2feee47
7 changed files with 8 additions and 45 deletions
@@ -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;
```
默认值要求:
@@ -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;
-4
View File
@@ -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,
+1 -5
View File
@@ -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
+1 -4
View File
@@ -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() {
-3
View File
@@ -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
-10
View File
@@ -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
}