e31cc54b8e
- 门户通用聊天:选择已批准模型直接对话,审批通过后自动开通用户级运行时 API Key(加密落库,限额取批准值),聊天经受管网关统一认证/限流/配额/审计; 会话哈希链完整性 + busy 租约防并发,失败不落库。 - 扫码登录:identity_providers 扩展 wecom/dingtalk/feishu,管理端配置 (AppID/AppSecret/AgentID/回调/自动开户/默认部门),登录页自动展示; one-time state 防 CSRF,provider_uid 全局唯一防多账号绑定,平台端点 固定公网 URL 复用 public-only 拨号。 - 个人安全策略:账号安全页(登录设备管理/吊销非当前会话/登录提醒开关/ 扫码绑定解绑),登录成功发布 security.login_detected 事件按偏好落站内信 (新增 security 类别),会话索引只存令牌摘要并惰性清理。 - 迁移 000038-000041;修复 social update 参数越界/凭据回读/路由挂载缺失; 全量测试 25 包通过,前端 admin/portal 构建通过,端到端验证完成。
35 lines
1.5 KiB
Go
35 lines
1.5 KiB
Go
package identity
|
|
|
|
import (
|
|
"context"
|
|
|
|
platformid "aigateway.local/core/internal/platform/id"
|
|
)
|
|
|
|
// InsertOutboxEvent 发布一条 outbox 事件(供通知 worker 消费)。
|
|
func (r *Repository) InsertOutboxEvent(ctx context.Context, eventType, aggregateType, aggregateID string, payload []byte) error {
|
|
if r.pool == nil {
|
|
return ErrUnavailable
|
|
}
|
|
eventID, err := platformid.NewUUID()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = r.pool.Exec(ctx, `INSERT INTO gateway.outbox_events(event_id,event_type,event_version,aggregate_type,aggregate_id,payload) VALUES($1,$2,1,$3,$4,$5)`, eventID, eventType, aggregateType, aggregateID, payload)
|
|
return mapRepositoryError(err)
|
|
}
|
|
|
|
// SecurityPrefs 返回登录通知偏好;未配置时默认开启。
|
|
func (r *Repository) SecurityPrefs(ctx context.Context, portalUserID string) (bool, error) {
|
|
var loginNotify bool
|
|
err := r.pool.QueryRow(ctx, `SELECT COALESCE((SELECT login_notify FROM gateway.portal_security_prefs WHERE portal_user_id=$1),true)`, portalUserID).Scan(&loginNotify)
|
|
return loginNotify, mapRepositoryError(err)
|
|
}
|
|
|
|
// SetSecurityPrefs 更新登录通知偏好。
|
|
func (r *Repository) SetSecurityPrefs(ctx context.Context, portalUserID string, loginNotify bool) error {
|
|
_, err := r.pool.Exec(ctx, `INSERT INTO gateway.portal_security_prefs(portal_user_id,login_notify) VALUES($1,$2)
|
|
ON CONFLICT(portal_user_id) DO UPDATE SET login_notify=$2,updated_at=clock_timestamp()`, portalUserID, loginNotify)
|
|
return mapRepositoryError(err)
|
|
}
|