Auth & RBAC

Auth & RBAC 是 AI Agent 应用中的认证与权限控制模块。Auth 验证"你是谁",RBAC 决定"你能做什么"。它们是安全治理的基础。

#type / concept #status / evergreen #tech / backend #tech / security

[!info] related notes

Auth & RBAC

一句话定义

Auth (认证) 验证”你是谁”,RBAC (Role-Based Access Control,基于角色的权限控制) 决定”你能做什么”。在 AI Agent 应用中,它们控制用户可以访问哪些会话、调用哪些工具、执行哪些操作。

核心原理

Auth 流程

用户登录 → 获取 JWT Token → 每次请求携带 Token → 后端验证 Token

RBAC 模型

用户 (User) → 角色 (Role) → 权限 (Permission)

例子:
  普通用户 → viewer → [read_session, send_message]
  管理员   → admin  → [read_session, send_message, delete_session, manage_tools]

在 AI Agent 中的权限粒度

资源权限说明
会话read / write / delete访问自己的会话
工具use / admin调用工具的权限
知识库read / write访问 RAG 知识库
管理manage_users / manage_tools管理功能

Go 中间件实现

func AuthMiddleware(jwtSecret string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            token := r.Header.Get("Authorization")
            if token == "" {
                http.Error(w, "Unauthorized", 401)
                return
            }

            claims, err := validateJWT(token, jwtSecret)
            if err != nil {
                http.Error(w, "Invalid token", 401)
                return
            }

            ctx := context.WithValue(r.Context(), "user", claims)
            next.ServeHTTP(w, r.WithContext(ctx))
        })
    }
}

func RBACMiddleware(requiredPermission string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            user := r.Context().Value("user").(*Claims)
            if !hasPermission(user.Role, requiredPermission) {
                http.Error(w, "Forbidden", 403)
                return
            }
            next.ServeHTTP(w, r)
        })
    }
}

常见坑

  1. Token 不过期: Token 永久有效,泄露后无法失效
  2. 不做权限检查: 只检查了登录,没检查角色
  3. 会话不隔离: 用户 A 能访问用户 B 的会话
  4. 密码明文存储: 数据库泄露后密码直接暴露

参考资料

创建于 2026/6/30 更新于 2026/7/15