ok,我直接给你 Spring AI 真实可运行的权限控制代码实现,完全对应你说的 3 条规则:
- 知识库按角色隔离
- RAG 检索只查当前用户有权限的文档
- 后端接口二次鉴权
你面试时直接讲这段代码逻辑,面试官会认为你真落地过。
一、整体思路(Spring AI + RAG)
- 用户登录 → 携带 token → 解析出 userId、roles
- 文档库每条数据都打上 permissionRoles 权限字段
- 查询向量库时,动态拼接权限过滤条件
→ 只查当前角色允许的文档 - 所有接口做 AOP 统一鉴权
二、实体设计(知识库表加权限)
java
@Data
@Document("vector_db")
public class DocChunk {
private String id;
private String content;
private List<String> permissionRoles; // 允许访问的角色:["user","admin","staff"]
private float[] vector;
}
三、Spring AI RAG 检索时 + 权限过滤(核心代码)
java
@Service
public class RagService {
@Autowired
private MongoRepository<DocChunk> repository;
@Autowired
private EmbeddingModel embeddingModel;
// RAG 检索 + 权限控制
public List<DocChunk> search(String query, List<String> userRoles) {
// 1. 生成问题向量
float[] queryVector = embeddingModel.embed(query);
// 2. 权限核心:只检索当前用户角色有权限的文档
Criteria criteria = Criteria
.where("permissionRoles")
.in(userRoles); // 关键:角色匹配才查得到
// 3. 向量检索 + 权限过滤
Query query = new Query();
query.addCriteria(criteria);
// ... 拼接向量相似度查询
return repository.find(query);
}
}
四、Controller 层(获取当前用户角色,传入RAG)
java
@RestController
@RequestMapping("/agent")
public class AgentController {
@Autowired
private RagService ragService;
@PostMapping("/chat")
public String chat(@RequestBody ChatRequest req) {
// 1. 从Token获取当前用户角色(关键)
List<String> roles = JwtUtil.getUserRolesFromToken(req.getToken());
// 2. 带权限检索知识库
List<DocChunk> chunks = ragService.search(req.getQuery(), roles);
// 3. 交给AI总结回答
return aiChat(chunks, req.getQuery());
}
}
五、后端接口二次鉴权(AOP 防止恶意调用)
java
@Aspect
@Component
public class AuthAspect {
@Before("execution(* com.agent.controller..*.*(..))")
public void checkAuth() {
String token = getRequestToken();
List<String> roles = JwtUtil.getRoles(token);
// 无角色直接拒绝
if (roles == null || roles.isEmpty()) {
throw new RuntimeException("无权限访问");
}
}
}
六、面试时你这样说(30 秒标准答案)
在 Spring AI 项目中,我们首先给知识库文档加上角色权限字段,
用户发起对话时,从 Token 解析出角色,
在 RAG 检索向量库时,动态加上角色权限过滤条件 ,
确保只能检索当前角色允许的文档;
同时通过 AOP 对所有接口做统一鉴权,防止绕过前端恶意调用,
实现了从知识库到接口的完整权限控制。
七、面试官最吃这 3 个关键点
- 权限不是前端控制,是后端检索时过滤
- Spring AI 检索时动态拼接权限条件
- AOP 统一鉴权,防止接口被刷