Auth & RBAC
Auth & RBAC 是 AI Agent 应用中的认证与权限控制模块。Auth 验证"你是谁",RBAC 决定"你能做什么"。它们是安全治理的基础。
#type / concept
#status / evergreen
#tech / backend
#tech / security
[!info] related notes
- 所属 MOC: AI Agent Application MOC, Security MOC
- 相关: Audit Log, Tool Permission Check
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)
})
}
}
常见坑
- Token 不过期: Token 永久有效,泄露后无法失效
- 不做权限检查: 只检查了登录,没检查角色
- 会话不隔离: 用户 A 能访问用户 B 的会话
- 密码明文存储: 数据库泄露后密码直接暴露