首页 > 综合 > 宝藏问答 >

问 springsecurity 权限管理 核心实战详解

2026-11-12 16:11:29
最佳答案

答

springsecurity 权限管理是一套安全框架,核心分成认证和授权两大模块,认证解决你是谁,授权解决你能做什么,也就是常说的登录校验和权限控制。框架默认采用过滤器链机制,所有请求都会经过多层过滤器,完成身份校验之后,再判断当前用户拥有的角色或者权限,决定能不能访问对应的接口资源。springsecurity 支持基于角色控制,也支持细粒度的权限控制,还可以结合数据库存储用户角色权限,实现动态权限,同时支持注解方式在 controller 方法上直接开启权限校验,是 springboot 项目最主流的安全方案。很多新手容易混淆认证和授权,把登录成功就等同于拥有全部访问权限,实际上登录只是完成身份确认,接口访问仍然需要匹配对应的权限标识,springsecurity6 版本改动比较大,废弃了很多旧配置写法,推荐使用 SecurityFilterChain 组件进行配置,不再使用老的 WebSecurityConfigurerAdapter,升级项目的时候很容易踩这个版本兼容坑。

核心概念说明

概念含义
认证 Authentication校验用户身份,账号密码 token 等登录验证
授权 Authorization身份通过之后,校验角色或者权限是否匹配
权限 Authority细粒度权限标识,比如 user add user delete
角色 Role角色集合,比如 admin normal user,角色本质也是特殊权限,默认带 ROLE_前缀
过滤器链 Filter Chain请求依次经过多个安全过滤器,是框架执行核心
SecurityContext安全上下文,保存当前登录用户认证信息

两种权限控制方式

第一种 配置类 url 拦截方式,在 SecurityFilterChain 里面配置请求规则,指定哪些 url 需要什么角色或者权限,适合统一接口路径批量管控

第二种 注解方式,在 controller 类或者方法上加注解,比如 PreAuthorize,适合单接口细粒度控制,需要提前开启注解支持

基础配置步骤

第一步 引入 springsecurity 相关 starter 依赖,springboot 项目直接导入对应 starter,版本和 springboot 版本保持匹配

第二步 编写 SecurityFilterChain 配置类,关闭或者开启 csrf,配置登录页面 登录成功跳转 未授权处理

第三步 配置 UserDetailsService,从数据库读取用户账号 密码 角色权限,密码必须配置密码编码器 PasswordEncoder,推荐 BCryptPasswordEncoder,不能明文存储密码

第四步 配置授权规则,给不同请求路径绑定角色或者权限

第五步 开启方法级注解支持,添加 @EnableMethodSecurity,启用 PreAuthorize 注解

第六步 编写 controller 接口,在方法上添加权限校验注解,启动项目测试未登录 无权限 有权限三种访问场景

动态权限扩展

基础版本权限写死在配置类里面,企业项目一般需要动态权限,把角色 权限 接口路径关系存数据库,自定义 SecurityMetadataSource,每次请求动态读取数据库里面的权限映射,实现新增角色不用修改代码重启项目。

同时可以整合 jwt,把 token 放到请求头,自定义过滤器解析 jwt,把用户权限信息写入 SecurityContext,实现前后端分离项目的无状态权限管理。

常见踩坑点

角色名称默认需要 ROLE_前缀,如果配置的时候前缀写错,会出现明明分配角色但是依然提示 403 无权限

密码如果没有加密,直接明文比对,springsecurity 会直接拒绝登录

springsecurity6 已经移除 WebSecurityConfigurerAdapter,继续继承这个类项目启动报错

csrf 默认开启,前后端分离项目如果不关闭 csrf,post 请求容易被拦截返回 403

总结

springsecurity 权限管理核心就是认证之后做授权,支持 url 配置授权和注解方法授权两种模式,企业项目常搭配数据库动态权限和 jwt 无状态方案,重点注意版本差异 角色前缀 密码加密 403 无权限这类高频问题,理解过滤器链和 SecurityContext 运行原理,才能灵活自定义权限逻辑。

【常见问题】

问题 1 springsecurity 权限管理出现 403 无权限是什么原因

回答 1 springsecurity 权限管理出现 403 无权限,一般是当前登录用户角色或者权限标识和接口要求不匹配,常见原因是角色缺少 ROLE_前缀,或者权限数据没有正确加载到 SecurityContext。

问题 2 springsecurity 权限管理可以实现动态权限吗

回答 1 springsecurity 权限管理支持动态权限,把角色权限和接口映射存入数据库,自定义权限元数据读取组件,请求时动态加载权限规则,不需要修改硬编码配置。

问题 3 springsecurity 权限管理 PreAuthorize 注解需要开启吗

回答 1 springsecurity 权限管理使用 PreAuthorize 注解,必须添加 EnableMethodSecurity 开启方法级权限支持,没有开启注解不会生效,接口不会执行权限校验。

【免责申明】

本内容为 springsecurity 技术学习参考,不同大版本 API 改动较大,生产环境请对照对应版本官方文档,结合业务安全规范调整权限方案。