fix: keep only tenant realname review policy
This commit is contained in:
@@ -160,15 +160,11 @@
|
|||||||
|
|
||||||
AccessKey 建议使用最小权限 RAM 子账号,只授权实人认证相关 OpenAPI。生产环境如果后续接入 KMS/Secrets Manager,`hg_sys_config` 中可只保存密钥引用。
|
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_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');
|
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
|
```sql
|
||||||
ALTER TABLE hotgo.im_tenant_config
|
ALTER TABLE hotgo.im_tenant
|
||||||
ADD COLUMN realname_review_policy TINYINT(1) NOT NULL DEFAULT 0 COMMENT '实名审核策略:0不审核,1自动审核且失败转人工' AFTER max_group_members,
|
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;
|
|
||||||
```
|
```
|
||||||
|
|
||||||
默认值要求:
|
默认值要求:
|
||||||
|
|||||||
@@ -3,11 +3,6 @@
|
|||||||
-- 说明:
|
-- 说明:
|
||||||
-- 1. realname_review_policy=0:不自动审核,实名提交进入 pending,等待后台人工审核。
|
-- 1. realname_review_policy=0:不自动审核,实名提交进入 pending,等待后台人工审核。
|
||||||
-- 2. realname_review_policy=1:自动调用阿里云审核,通过写 verified;失败、异常、不确定写 manual_review,等待人工复核。
|
-- 2. realname_review_policy=1:自动调用阿里云审核,通过写 verified;失败、异常、不确定写 manual_review,等待人工复核。
|
||||||
-- 3. realname_provider_mode 只表示阿里云核验模式,不承担审核开关含义。
|
|
||||||
|
|
||||||
ALTER TABLE hotgo.im_tenant_config
|
ALTER TABLE hotgo.im_tenant
|
||||||
ADD COLUMN realname_review_policy TINYINT(1) NOT NULL DEFAULT 0 COMMENT '实名审核策略:0不审核,1自动审核且失败转人工' AFTER max_group_members,
|
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;
|
|
||||||
|
|||||||
@@ -562,10 +562,6 @@ func createTenantRegistry(tx *sql.Tx, registryDB, _ string) error {
|
|||||||
max_groups BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
max_groups BIGINT UNSIGNED NOT NULL DEFAULT 0,
|
||||||
max_group_members INT UNSIGNED NOT NULL DEFAULT 0,
|
max_group_members INT UNSIGNED NOT NULL DEFAULT 0,
|
||||||
realname_review_policy TINYINT(1) 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,
|
aliyun_moderation_enabled TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
local_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,
|
message_encryption_enabled TINYINT(1) NOT NULL DEFAULT 0,
|
||||||
|
|||||||
@@ -28,8 +28,7 @@ func (a *adapter) RealNamePolicy(tenantID t.TenantID) (*t.RealNamePolicy, error)
|
|||||||
var policy t.RealNamePolicy
|
var policy t.RealNamePolicy
|
||||||
// 商户配置已并入 im_tenant(manager 仓库 im_tenant_merge_config.sql),实名政策兜底直查切到 im_tenant;
|
// 商户配置已并入 im_tenant(manager 仓库 im_tenant_merge_config.sql),实名政策兜底直查切到 im_tenant;
|
||||||
// id AS tenant_id 保持扫描列名不变,ErrNoRows/未知列仍回退默认值,兼容阶段一迁移未执行的滚动发布窗口
|
// id AS tenant_id 保持扫描列名不变,ErrNoRows/未知列仍回退默认值,兼容阶段一迁移未执行的滚动发布窗口
|
||||||
err := db.GetContext(ctx, &policy, `SELECT id AS tenant_id, realname_review_policy, realname_provider_mode,
|
err := db.GetContext(ctx, &policy, `SELECT id AS tenant_id, realname_review_policy
|
||||||
realname_required, realname_allow_skip, realname_remind_after
|
|
||||||
FROM im_tenant WHERE id=? LIMIT 1`, tenantID)
|
FROM im_tenant WHERE id=? LIMIT 1`, tenantID)
|
||||||
if errors.Is(err, sql.ErrNoRows) {
|
if errors.Is(err, sql.ErrNoRows) {
|
||||||
policy = *defaultRealNamePolicy(tenantID)
|
policy = *defaultRealNamePolicy(tenantID)
|
||||||
@@ -50,9 +49,6 @@ func defaultRealNamePolicy(tenantID t.TenantID) *t.RealNamePolicy {
|
|||||||
policy := &t.RealNamePolicy{
|
policy := &t.RealNamePolicy{
|
||||||
TenantID: tenantID,
|
TenantID: tenantID,
|
||||||
ReviewPolicy: t.RealNameReviewPolicyNone,
|
ReviewPolicy: t.RealNameReviewPolicyNone,
|
||||||
ProviderMode: "id_card_2factor",
|
|
||||||
AllowSkip: true,
|
|
||||||
RemindAfter: "24h",
|
|
||||||
}
|
}
|
||||||
policy.Normalize()
|
policy.Normalize()
|
||||||
return policy
|
return policy
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ func (s testRealNameConfigStore) Policy(tenantID types.TenantID) (*types.RealNam
|
|||||||
return nil, s.err
|
return nil, s.err
|
||||||
}
|
}
|
||||||
if s.policy == nil {
|
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 := *s.policy
|
||||||
policy.TenantID = tenantID
|
policy.TenantID = tenantID
|
||||||
@@ -2182,9 +2182,6 @@ func TestServeIMRealNameSubmissionAutoReviewFallsBackToManual(t *testing.T) {
|
|||||||
store.Security = security
|
store.Security = security
|
||||||
store.RealNameConfig = testRealNameConfigStore{policy: &types.RealNamePolicy{
|
store.RealNameConfig = testRealNameConfigStore{policy: &types.RealNamePolicy{
|
||||||
ReviewPolicy: types.RealNameReviewPolicyAutoManual,
|
ReviewPolicy: types.RealNameReviewPolicyAutoManual,
|
||||||
ProviderMode: "id_card_2factor",
|
|
||||||
AllowSkip: true,
|
|
||||||
RemindAfter: "24h",
|
|
||||||
}}
|
}}
|
||||||
store.ThirdPartyConfig = testThirdPartyConfigStore{}
|
store.ThirdPartyConfig = testThirdPartyConfigStore{}
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|||||||
@@ -417,9 +417,6 @@ func defaultRealNamePolicy(tenantID types.TenantID) *types.RealNamePolicy {
|
|||||||
policy := &types.RealNamePolicy{
|
policy := &types.RealNamePolicy{
|
||||||
TenantID: tenantID,
|
TenantID: tenantID,
|
||||||
ReviewPolicy: types.RealNameReviewPolicyNone,
|
ReviewPolicy: types.RealNameReviewPolicyNone,
|
||||||
ProviderMode: "id_card_2factor",
|
|
||||||
AllowSkip: true,
|
|
||||||
RemindAfter: "24h",
|
|
||||||
}
|
}
|
||||||
policy.Normalize()
|
policy.Normalize()
|
||||||
return policy
|
return policy
|
||||||
|
|||||||
@@ -11,20 +11,10 @@ const (
|
|||||||
type RealNamePolicy struct {
|
type RealNamePolicy struct {
|
||||||
TenantID TenantID `db:"tenant_id" json:"tenant_id"`
|
TenantID TenantID `db:"tenant_id" json:"tenant_id"`
|
||||||
ReviewPolicy int `db:"realname_review_policy" json:"realname_review_policy"`
|
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.
|
// Normalize fills defaults and clamps unsupported enum values.
|
||||||
func (p *RealNamePolicy) Normalize() {
|
func (p *RealNamePolicy) Normalize() {
|
||||||
if p.ProviderMode == "" {
|
|
||||||
p.ProviderMode = "id_card_2factor"
|
|
||||||
}
|
|
||||||
if p.RemindAfter == "" {
|
|
||||||
p.RemindAfter = "24h"
|
|
||||||
}
|
|
||||||
if p.ReviewPolicy != RealNameReviewPolicyAutoManual {
|
if p.ReviewPolicy != RealNameReviewPolicyAutoManual {
|
||||||
p.ReviewPolicy = RealNameReviewPolicyNone
|
p.ReviewPolicy = RealNameReviewPolicyNone
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user