Spring Security 是 Spring 生态官方级安全框架,专注于 Java Web 系统的身份认证、权限授权、安全防护。它开箱即用、扩展性极强,完美适配 SpringBoot,是目前企业级项目权限安全的首选方案,远超传统 Shiro 框架在微服务、OAuth2、分布式场景的适配能力。
一、Spring Security 核心优势与适用场景
1. 核心优势
原生适配 Spring 生态:SpringBoot 无缝集成,零配置即可启用基础安全能力,无需繁琐搭建
功能全覆盖:内置登录认证、角色权限、资源拦截、会话管理、CSRF、XSS、防暴力破解等安全机制
扩展性极强:支持自定义登录逻辑、权限规则、认证失败处理、Token 机制、第三方登录
微服务专属支持:完美适配 OAuth2.0、JWT、分布式会话、网关鉴权,适配微服务架构
企业级安全规范:遵循官方安全标准,修复各类 Web 安全漏洞,规避业务安全风险
2. 核心适用场景
Web 项目登录认证、账号密码校验、验证码登录
接口权限控制、角色资源拦截(游客/普通用户/管理员权限隔离)
前后端分离项目 JWT 令牌认证、无状态登录
微服务网关统一鉴权、分布式权限管理
第三方登录(微信、QQ、GitHub)、OAuth2 授权登录
接口安全防护:防 CSRF 跨站请求、防会话劫持、防暴力破解
二、核心核心概念与执行流程(必懂)
1. 两大核心能力
Spring Security 所有功能,本质只做两件事:
认证(Authentication):校验「你是谁」,判断用户账号密码是否合法,完成登录校验
授权(Authorization):校验「你能做什么」,判断当前登录用户是否拥有访问接口/页面的权限
2. 核心核心组件
SecurityContext(安全上下文):存储当前登录用户信息,全局可获取,基于 ThreadLocal 线程隔离
Authentication(认证对象):封装用户登录信息、权限列表、认证状态
UserDetails(用户详情):标准用户模型,封装用户名、密码、权限、账号状态(锁定/过期)
UserDetailsService:核心接口,用于根据用户名查询用户信息,对接数据库的核心入口
PasswordEncoder(密码加密器):密码加密、校验工具,生产强制使用 BCrypt 加密
SecurityFilterChain(安全过滤器链):拦截所有请求,依次执行认证、授权、安全校验逻辑
3. 完整认证流程
客户端发起登录请求,携带用户名、密码
框架拦截请求,调用
UserDetailsService根据用户名查询数据库用户获取数据库加密密码,通过
PasswordEncoder校验前端传入密码密码校验通过,封装用户权限信息,生成认证对象存入安全上下文
后续请求自动校验登录状态、权限,无权限则返回 401/403 状态码
三、SpringBoot 快速整合(零基础入门)
1. 引入核心依赖
SpringBoot 项目无需指定版本,自动适配框架版本,pom.xml 引入依赖即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2. 默认原生效果
引入依赖后,项目无需任何配置,自动生效:
所有接口默认拦截,必须登录后才能访问
自动生成默认登录页面、登录接口
默认用户名:
user,密码为项目启动控制台随机生成 UUID
默认配置仅适用于测试,生产环境必须自定义账号、权限、登录逻辑。
3. 基础自定义配置(内存用户-测试用)
自定义内存账号、权限、放行路径,快速测试权限功能:
@Configuration @EnableWebSecurity // 开启Web安全注解 public class SecurityConfig { // 密码加密器(生产固定使用BCrypt) @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } // 自定义内存用户与权限 @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withUsername("user") .password(passwordEncoder().encode("123456")) .roles("USER") // 普通用户权限 .build(); UserDetails admin = User.withUsername("admin") .password(passwordEncoder().encode("123456")) .roles("ADMIN", "USER") // 管理员权限 .build(); return new InMemoryUserDetailsManager(user, admin); } // 核心拦截规则配置 @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth .requestMatchers("/login", "/register", "/static/**").permitAll() // 放行无需登录接口 .requestMatchers("/admin/**").hasRole("ADMIN") // 仅管理员可访问 .requestMatchers("/user/**").hasRole("USER") // 仅普通用户可访问 .anyRequest().authenticated() // 其余所有接口必须登录认证 ); // 开启默认登录页面 http.formLogin(); return http.build(); } }
四、生产核心改造:对接数据库实现真实登录
内存用户仅用于测试,生产项目必须对接数据库,查询真实账号密码完成认证。核心只需重写UserDetailsService。
1. 自定义 UserDetailsService
@Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserMapper userMapper; // 数据库用户Mapper @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 1. 根据用户名查询数据库用户 User user = userMapper.selectByUsername(username); if (user == null) { throw new UsernameNotFoundException("用户名不存在"); } // 2. 查询用户对应角色权限(可扩展多角色、多权限) List<GrantedAuthority> authorityList = new ArrayList<>(); authorityList.add(new SimpleGrantedAuthority("ROLE_" + user.getRole())); // 3. 封装用户信息返回 return User.withUsername(user.getUsername()) .password(user.getPassword()) // 数据库加密密码 .authorities(authorityList) .accountLocked(user.getStatus() == 1) // 账号锁定状态 .build(); } }
2. 配置类适配数据库登录
无需额外修改配置类,框架会自动优先使用自定义的 UserDetailsService,替代默认内存登录,实现数据库账号认证。
五、前后端分离项目专属改造(重点)
Spring Security 默认适配服务端渲染页面,前后端分离项目存在页面跳转、CSRF 拦截、返回格式不统一问题,必须针对性改造。
1. 前后端分离核心改造点
关闭默认登录页面、默认跳转,改为JSON 格式返回
关闭 CSRF 防护(前后端分离 Token 模式无需 CSRF)
自定义登录成功/失败、未登录、无权限、登出接口返回结果
适配 JWT 无状态令牌登录
2. 完整前后端分离配置类
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 关闭CSRF防护 .csrf(csrf -> csrf.disable()) // 授权规则 .authorizeHttpRequests(auth -> auth .requestMatchers("/api/login", "/api/register").permitAll() .anyRequest().authenticated() ) // 自定义登录配置 .formLogin(login -> login .loginProcessingUrl("/api/login") // 自定义登录接口 .successHandler(new LoginSuccessHandler()) // 登录成功JSON返回 .failureHandler(new LoginFailHandler()) // 登录失败JSON返回 ) // 自定义异常处理 .exceptionHandling(ex -> ex .authenticationEntryPoint(new NoLoginHandler()) // 未登录 .accessDeniedHandler(new NoAuthHandler()) // 无权限 ) // 登出配置 .logout(logout -> logout .logoutUrl("/api/logout") .logoutSuccessHandler(new LogoutSuccessHandler()) ); return http.build(); } }
3. 统一 JSON 处理器示例
所有处理器统一返回{code, msg, data}格式,适配前端解析,以未登录处理器为例:
public class NoLoginHandler implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { response.setContentType("application/json;charset=UTF-8"); PrintWriter writer = response.getWriter(); // 统一返回未登录提示 Result result = Result.error(401, "用户未登录,请先登录"); writer.write(JSON.toJSONString(result)); writer.flush(); } }
六、核心权限控制方案
1. 三种权限控制方式
(1)URL 级别拦截(配置类)
在 SecurityFilterChain 中通过路径匹配控制权限,适合全局接口拦截。
(2)注解级别控制(开发最常用)
开启注解权限,在接口/类上精准控制权限,灵活度极高,需先开启注解支持:
// 开启权限注解 @EnableMethodSecurity
常用注解:
@PreAuthorize("isAuthenticated()"):必须登录@PreAuthorize("hasRole('ADMIN')"):必须拥有管理员角色@PreAuthorize("hasPermission('user:add')"):必须拥有指定权限标识
(3)动态权限(生产必备)
数据库存储角色、权限、接口关联关系,实现动态配置权限、无需重启项目,适配后台权限管理系统。
七、高级核心特性
1. 密码加密机制
Spring Security 强制推荐BCrypt 加密算法,自带随机盐值,相同密码加密结果不同,不可逆、安全性极高,生产禁止明文存储密码。
2. 会话管理
控制单账号单点登录、多端登录互踢
自定义会话超时时间、超时跳转
无状态会话适配 JWT 令牌登录
3. 安全防护机制
CSRF 跨站请求伪造防护(传统网页项目开启,前后端分离关闭)
XSS 跨站脚本攻击防护
会话固定攻击防护
请求劫持、非法访问拦截
4. OAuth2.0 第三方登录
原生支持 OAuth2 协议,可快速对接 GitHub、Gitee、微信、QQ 第三方登录,适配单点登录、微服务授权场景。
八、生产高频坑点与解决方案
1. 常见报错与坑点
密码校验失败:数据库密码未加密、加密器不匹配、手动赋值密码未使用 BCrypt 加密
放行接口依然拦截:静态资源路径写错、拦截器优先级冲突、未配置 permitAll()
前后端分离返回页面不JSON:未自定义处理器、未关闭默认表单登录跳转
权限注解不生效:未开启 @EnableMethodSecurity 注解、权限前缀不匹配
跨域问题:Security 拦截跨域预检请求,需单独放行 OPTIONS 请求
账号锁定/过期不生效:UserDetails 封装状态参数错误
2. 生产优化最佳实践
统一自定义登录、权限、异常返回格式,适配前后端分离
密码强制 BCrypt 加密,禁止明文、MD5 弱加密
区分开发/生产环境配置,生产关闭默认登录页面、开启日志监控
使用 JWT 无状态登录,适配分布式、微服务集群
细化权限粒度,区分角色权限、资源权限,实现精细化管控
添加登录限流、防暴力破解,限制账号错误登录次数
九、框架选型对比 & 总结
1. Spring Security vs Shiro
Spring Security:Spring 官方、功能全面、安全性高、适配微服务/OAuth2/JWT,企业级主流,学习成本略高
Shiro:轻量、简单易用、入门快,功能单一,微服务、分布式适配差,适合小型单体项目
2. 全文总结
Spring Security 看似繁琐,核心逻辑只有认证+授权两大模块。新手入门只需掌握依赖整合、自定义用户认证、拦截规则配置;进阶重点吃透前后端分离改造、JWT 无状态登录、注解权限控制;生产落地需做好密码加密、统一返回、安全防护、动态权限与异常处理。
作为 Spring 生态官方安全框架,它是 Java 项目权限体系的标准答案,掌握后可覆盖单体、微服务、第三方登录、分布式鉴权等所有业务场景,是后端开发必备核心技能。