spring boot 集成 spring security 实现权限控制的核心是认证可靠、授权清晰、拦截精准;通过自动配置依赖、函数式 securityfilterchain 规则、userdetailsservice 对接数据库权限模型、@preauthorize 方法级控制,完成 rbac 与 abac 支持。

Spring Boot 集成 Spring Security 实现权限安全控制,核心是三件事:认证可靠、授权清晰、拦截精准。不需要写一堆过滤器,靠自动配置 + 函数式规则 + 注解驱动就能落地。
加依赖,启用自动配置
在 pom.xml 中引入基础依赖即可触发 Spring Security 的自动装配:
- spring-boot-starter-security:提供认证授权主能力,引入后所有 HTTP 接口默认受保护
- spring-boot-starter-web:支撑 Web 请求拦截与响应
- 如需查数据库用户,再加 mybatis-spring-boot-starter 或 spring-boot-starter-jdbc
项目启动后,未登录访问任意接口会跳转到默认登录页(/login),控制台会打印一个临时用户名 user 和随机密码(UUID 格式),仅用于快速验证,生产环境必须替换。
配 SecurityFilterChain,分层放行资源
新建配置类,用 @EnableWebSecurity 标记,声明 SecurityFilterChain Bean。Spring Security 6+ 已弃用继承方式,全部采用函数式配置:
-
完全放行:验证码、登录接口(/auth/login)、静态资源(/css/**、/js/**)、Swagger 文档(开发环境)用
.permitAll() -
认证即可:个人中心、头像上传等非管理接口,用
.authenticated() -
权限驱动:后台管理路径(如 /api/v1/admin/**)配合
.hasAuthority("sys:admin:full")或角色判断
示例片段:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
.requestMatchers("/auth/**", "/css/**", "/js/**").permitAll()
.requestMatchers("/api/v1/profile/**").authenticated()
.requestMatchers("/api/v1/admin/**").hasAuthority("sys:admin:full")
.anyRequest().authenticated());
实现 UserDetailsService,对接数据库权限模型
默认只支持内存用户,生产必须加载真实用户数据。关键点有三个:
- 编写类实现 UserDetailsService,重写
loadUserByUsername方法,一次性查出用户、所属角色、拥有的权限标识(如 sys:user:list) - 返回对象必须是 UserDetails 实现类(推荐使用
org.springframework.security.core.userdetails.User) - 必须注册 PasswordEncoder Bean(推荐
BCryptPasswordEncoder),确保密码比对时能正确解密哈希值
数据库建议建 5–7 张表联动:用户表(sys_user)、角色表(sys_role,role_key 如 ROLE_ADMIN)、权限表(sys_permission,如 order:pay:cancel)、用户-角色中间表、角色-权限中间表。这样改权限不改代码,也不重启服务。
用 @PreAuthorize 做方法级细粒度控制
URL 级规则只能控到路径,真正“谁能在什么条件下删某条订单”,得靠方法注解:
- 在配置类上加 @EnableMethodSecurity 开启方法级安全
- Controller 方法上标注
@PreAuthorize("hasAuthority('sys:order:delete')"),匹配权限标识 - 需要角色判断时用
@PreAuthorize("hasRole('ADMIN')"),注意它实际比对的是 ROLE_ADMIN(框架自动加前缀) - 结合 SpEL 可写更灵活逻辑,例如
@PreAuthorize("#id == authentication.principal.id or hasAuthority('sys:user:manage')"),表示“只能删自己的或管理员可删全部”
这套组合用下来,认证走流程、授权有结构、控制落到点,既满足 RBAC 常规需求,也支持 ABAC 场景扩展。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










