1. 页面概览
安全治理是 AIP 管理后台面向管理员的安全策略管理页,路由为 /admin/security。页面顶部安全概览卡片汇总敏感列、行级安全(RLS)、列级安全(CLS)、审计日志总数与 AI 护栏开关状态;下方两个 Tab 分别维护敏感列清单与 AI 护栏配置。
敏感列清单声明哪些表/列属于敏感数据及脱敏方式,是数据出口防护的依据;AI 护栏在查询进入链路时校验输入(敏感内容拦截、长度限制等),防止越权或注入。二者构成 AIP 查询链路的输入侧与输出侧防护。
一句话总结:安全治理把「敏感列声明 + AI 输入护栏」两项安全配置集中到一个页面,管理员可随时查看安全态势并调整防护策略。
2. 访问入口
2.1 路由与菜单
| 项目 | 值 |
|---|---|
| 路由 path | /admin/security |
| 路由 name | AdminSecurity |
| 路由 title | 安全治理 |
| requiresAuth | true(父级 /admin 另有 requiresAdmin) |
| 菜单位置 | AdminLayout 侧边栏菜单项「安全治理」 |
| 前端源码 | action/web/src/views/SecurityPage.vue |
| 路由注册 | action/web/src/router/index.js |
2.2 认证与权限
守卫校验 aip_is_admin='1',否则跳 /chat;请求走 action/web/src/api/aipClient.js(aip_token Bearer JWT),401 清 token 跳登录。
2.3 端口与 API 前缀
AIP 后端 18080,前缀 /aip-api(实际 /aip-api/v1/...,Vite 代理重写为 /api/v1)。
3. 界面布局
+------------------------------+
| 安全治理 [刷新] [alert 提示] |
| 安全概览(card) |
| 敏感列 | 行级安全(RLS) | |
| 列级安全(CLS) | 审计日志总数 |
| | AI 护栏(已开启/已关闭) |
| Tab:敏感列 | AI 护栏 |
+------------------------------+
| 敏感列 Tab(card): |
| 工具栏:[新建敏感列] |
| 表格:表名|列名|敏感类型|脱敏方式|描述|操作
| (行操作:编辑 | 删除) |
| AI 护栏 Tab(card): |
| 启用 AI 护栏 Switch + |
| 最大输入长度(字符) |
| 拦截关键词标签(只读) |
| + [保存护栏配置] |
+------------------------------+
各板块职责:安全概览卡片展示 GET /security/overview 的数字统计(缺失自动 0 兜底);敏感列 Tab 做增删改查;AI 护栏 Tab 配置开关与最大输入长度,保存后即时生效。
4. 交互元素
| 控件 | 位置 | 含义与作用 |
|---|---|---|
| 刷新 | 页头 | 并行刷新概览、敏感列与护栏配置,加载中禁用并显示「加载中...」 |
| 新建敏感列 / 行内编辑、删除 | 敏感列表格 | 弹窗:表名*、列名* 必填;敏感类型下拉 PII/FINANCIAL/HEALTH/CREDENTIAL;脱敏方式下拉 全掩码/部分掩码/哈希/令牌化/置空(对应 full_mask/partial_mask/hash/tokenize/nullify);删除有 confirm 确认 |
| 启用 AI 护栏 | AI 护栏 Tab | Switch 开关;关闭时最大输入长度输入框禁用 |
| 最大输入长度(字符) | AI 护栏 Tab | number 输入 min 1 max 100000 step 100,提示建议 1000~5000,超出该长度的输入将被拦截 |
| 保存护栏配置 | AI 护栏 Tab | 提交 {enabled, max_input_len} 到 PUT /security/guardrails,保存中按钮显示「保存中...」并禁用 |
5. 后端关联
API 端点(读挂 protected 登录组、写挂 admin 管理组):
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | /security/overview | 安全概览(sensitive_columns/rls_policies/cls_policies/audit_logs_total/ai_guardrail_enabled 等) |
| GET | /security/sensitive-columns | 敏感列列表(data.sensitive_columns) |
| POST / PUT / DELETE | /security/sensitive-columns[/:id] | 敏感列增删改 |
| GET | /security/guardrails | 护栏配置(enabled/max_input_len/block_keywords) |
| PUT | /security/guardrails | 更新护栏配置 |
5.1 关键机制
- GuardrailConfig:
enabled总开关、max_input_len(后端默认 4000,存 settings 表AI_GUARDRAIL_*键);CheckChatInput在查询进入时校验:关闭则跳过,超长返回「输入长度超过限制(最大 N 字)」错误。 - 概览卡片 AI 护栏状态优先读
ai_guardrail_enabled,字段缺失时回退表单中的enabled。 - 保存敏感列或护栏成功后都会刷新概览,保证统计联动;失败/未就绪时数字兜底 0,不白屏。
后端实现位于 action/products/aip/security/handler.go(双组注册)、service.go(护栏默认值/校验)、platform/model.SensitiveColumn。
6. 权限与安全
- 认证与角色:
aip_token+ 管理员(requiresAdmin);后端写操作挂 admin 组,非 admin Token 请求 403。 - 数据安全:敏感列声明属安全元数据,本页只维护声明;RLS/CLS 规则配置在「深度权限配置」页,本页仅展示统计数量。
- 写操作防护:敏感列删除有 confirm;护栏保存无二次确认,保存后直接作用于所有查询输入校验。
7. 常见问题与排错
问题 1:安全概览数字全部为 0
原因:GET /security/overview 失败(后端未就绪/401)或字段缺失,前端 num() 兜底 0。
处理:看 Network 确认概览请求返回;后端就绪后点「刷新」重拉。
问题 2:保存护栏提示「最大输入长度必须是正整数」
原因:长度输入被清空或为 0/负数。
处理:填写 1~100000 的正整数(建议 1000~5000)再保存。
问题 3:关闭 AI 护栏后长度输入框不可编辑
原因:max_input_len 输入框 disabled 绑定 enabled=false。
处理:先打开开关再调整长度,或直接保存后重新进入页面。
问题 4:保存护栏成功但概览卡片仍显示「已关闭」
原因:概览 ai_guardrail_enabled 与表单 enabled 来自不同接口,概览未刷新。
处理:点「刷新」或重新进入页面,概览与表单会重新拉取。
8. 已知缺陷与边界
| 项 | 说明 |
|---|---|
| 脱敏方式仅登记 | 敏感列只声明脱敏方式,页面不提供脱敏效果预览 |
| RLS/CLS 只读统计 | 概览只显示 RLS/CLS 数量,规则配置在「深度权限配置」页 |
| 拦截关键词只读 | block_keywords 仅以标签展示,本页不提供编辑 |
| 护栏保存即生效 | 保存护栏无二次确认,误改会立即影响查询输入校验 |
注:概览接口失败时统计静默显示 0 误导(接口失败显示 0,可能与真实值不符)已于 2026-09-06 修复(失败显示「加载失败」占位)。