Spring AI 如何进行权限控制

ok,我直接给你 Spring AI 真实可运行的权限控制代码实现,完全对应你说的 3 条规则:

  1. 知识库按角色隔离
  2. RAG 检索只查当前用户有权限的文档
  3. 后端接口二次鉴权

你面试时直接讲这段代码逻辑,面试官会认为你真落地过。


一、整体思路(Spring AI + RAG)

  1. 用户登录 → 携带 token → 解析出 userId、roles
  2. 文档库每条数据都打上 permissionRoles 权限字段
  3. 查询向量库时,动态拼接权限过滤条件
    → 只查当前角色允许的文档
  4. 所有接口做 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 个关键点

  1. 权限不是前端控制,是后端检索时过滤
  2. Spring AI 检索时动态拼接权限条件
  3. AOP 统一鉴权,防止接口被刷
相关推荐
BK贝壳3 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949654 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
张彦峰ZYF6 小时前
越过边界之前:Reward Seeker 实验如何改写智能体安全的时间逻辑
人工智能·ai agent·anthropic·智能体安全·reward seeker·“控制评价过程”泛化跨领域策略·envbom
拓恒技术6 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
罗西的思考8 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
CarIise8 小时前
SpringMVC 异常处理与拦截器
大数据·spring
在世修行8 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
字节跳动视频云技术团队9 小时前
720P 直升 8K,解密 2026 抖音美好奇妙夜巨幕超分黑科技
人工智能·音视频开发
知守观9 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
2601_962885729 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python