permissions.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "sort"
  6. "strings"
  7. )
  8. // PermissionKey 定义客服端菜单/功能的权限键(单级开关:有/无)。
  9. // 说明:目前系统没有真正的登录态(JWT/Session),所以权限校验依赖 X-User-Id。
  10. type PermissionKey string
  11. const (
  12. PermChat PermissionKey = "chat" // 对话
  13. PermKBTest PermissionKey = "kb_test" // 知识库测试(内部对话)
  14. PermKnowledge PermissionKey = "knowledge" // 知识库(含文档/导入)
  15. PermFAQs PermissionKey = "faqs" // 事件管理
  16. PermAnalytics PermissionKey = "analytics" // 数据报表
  17. PermLogs PermissionKey = "logs" // 日志中心
  18. PermPrompts PermissionKey = "prompts" // 提示词
  19. PermSettings PermissionKey = "settings" // AI 配置
  20. PermUsers PermissionKey = "users" // 用户管理
  21. )
  22. func AllPermissionKeys() []string {
  23. keys := []string{
  24. string(PermChat),
  25. string(PermKBTest),
  26. string(PermKnowledge),
  27. string(PermFAQs),
  28. string(PermAnalytics),
  29. string(PermLogs),
  30. string(PermPrompts),
  31. string(PermSettings),
  32. string(PermUsers),
  33. }
  34. sort.Strings(keys)
  35. return keys
  36. }
  37. func DefaultAgentPermissions() []string {
  38. return []string{string(PermChat)}
  39. }
  40. func normalizePermissionKeys(keys []string) []string {
  41. seen := map[string]bool{}
  42. out := make([]string, 0, len(keys))
  43. for _, k := range keys {
  44. kk := strings.TrimSpace(k)
  45. if kk == "" {
  46. continue
  47. }
  48. if seen[kk] {
  49. continue
  50. }
  51. seen[kk] = true
  52. out = append(out, kk)
  53. }
  54. sort.Strings(out)
  55. return out
  56. }
  57. func validatePermissionKeys(keys []string) error {
  58. allowed := map[string]bool{}
  59. for _, k := range AllPermissionKeys() {
  60. allowed[k] = true
  61. }
  62. for _, k := range keys {
  63. if !allowed[k] {
  64. return errors.New("存在不支持的权限键: " + k)
  65. }
  66. }
  67. return nil
  68. }
  69. // EncodePermissions 将权限数组编码为 JSON 字符串,用于存表。
  70. func EncodePermissions(keys []string) (string, error) {
  71. n := normalizePermissionKeys(keys)
  72. if err := validatePermissionKeys(n); err != nil {
  73. return "", err
  74. }
  75. b, err := json.Marshal(n)
  76. if err != nil {
  77. return "", err
  78. }
  79. return string(b), nil
  80. }
  81. // DecodePermissions 从 JSON 字符串解码权限数组。空串/无效 JSON 视为无权限数组。
  82. func DecodePermissions(raw string) []string {
  83. raw = strings.TrimSpace(raw)
  84. if raw == "" {
  85. return nil
  86. }
  87. var keys []string
  88. if err := json.Unmarshal([]byte(raw), &keys); err != nil {
  89. return nil
  90. }
  91. return normalizePermissionKeys(keys)
  92. }