Spring AI 如何进行权限控制

张开发
2026/4/21 4:00:02 15 分钟阅读

分享文章

Spring AI 如何进行权限控制
ok我直接给你Spring AI 真实可运行的权限控制代码实现完全对应你说的 3 条规则知识库按角色隔离RAG 检索只查当前用户有权限的文档后端接口二次鉴权你面试时直接讲这段代码逻辑面试官会认为你真落地过。一、整体思路Spring AI RAG用户登录 → 携带 token → 解析出 userId、roles文档库每条数据都打上permissionRoles 权限字段查询向量库时动态拼接权限过滤条件→ 只查当前角色允许的文档所有接口做AOP 统一鉴权二、实体设计知识库表加权限DataDocument(vector_db)publicclassDocChunk{privateStringid;privateStringcontent;privateListStringpermissionRoles;// 允许访问的角色[user,admin,staff]privatefloat[]vector;}三、Spring AI RAG 检索时 权限过滤核心代码ServicepublicclassRagService{AutowiredprivateMongoRepositoryDocChunkrepository;AutowiredprivateEmbeddingModelembeddingModel;// RAG 检索 权限控制publicListDocChunksearch(Stringquery,ListStringuserRoles){// 1. 生成问题向量float[]queryVectorembeddingModel.embed(query);// 2. 权限核心只检索当前用户角色有权限的文档CriteriacriteriaCriteria.where(permissionRoles).in(userRoles);// 关键角色匹配才查得到// 3. 向量检索 权限过滤QueryquerynewQuery();query.addCriteria(criteria);// ... 拼接向量相似度查询returnrepository.find(query);}}四、Controller 层获取当前用户角色传入RAGRestControllerRequestMapping(/agent)publicclassAgentController{AutowiredprivateRagServiceragService;PostMapping(/chat)publicStringchat(RequestBodyChatRequestreq){// 1. 从Token获取当前用户角色关键ListStringrolesJwtUtil.getUserRolesFromToken(req.getToken());// 2. 带权限检索知识库ListDocChunkchunksragService.search(req.getQuery(),roles);// 3. 交给AI总结回答returnaiChat(chunks,req.getQuery());}}五、后端接口二次鉴权AOP 防止恶意调用AspectComponentpublicclassAuthAspect{Before(execution(* com.agent.controller..*.*(..)))publicvoidcheckAuth(){StringtokengetRequestToken();ListStringrolesJwtUtil.getRoles(token);// 无角色直接拒绝if(rolesnull||roles.isEmpty()){thrownewRuntimeException(无权限访问);}}}六、面试时你这样说30 秒标准答案在 Spring AI 项目中我们首先给知识库文档加上角色权限字段用户发起对话时从 Token 解析出角色在 RAG 检索向量库时动态加上角色权限过滤条件确保只能检索当前角色允许的文档同时通过 AOP 对所有接口做统一鉴权防止绕过前端恶意调用实现了从知识库到接口的完整权限控制。七、面试官最吃这 3 个关键点权限不是前端控制是后端检索时过滤Spring AI 检索时动态拼接权限条件AOP 统一鉴权防止接口被刷

更多文章