Spring Security 从0到1

发布时间:2026/6/27 22:43:35
Spring Security 从0到1 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 groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-security/artifactId /dependency2. 默认原生效果引入依赖后项目无需任何配置自动生效所有接口默认拦截必须登录后才能访问自动生成默认登录页面、登录接口默认用户名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. 自定义 UserDetailsServiceService 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. 查询用户对应角色权限可扩展多角色、多权限 ListGrantedAuthority 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;charsetUTF-8); PrintWriter writer response.getWriter(); // 统一返回未登录提示 Result result Result.error(401, 用户未登录请先登录); writer.write(JSON.toJSONString(result)); writer.flush(); } }六、核心权限控制方案1. 三种权限控制方式1URL 级别拦截配置类在 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 ShiroSpring SecuritySpring 官方、功能全面、安全性高、适配微服务/OAuth2/JWT企业级主流学习成本略高Shiro轻量、简单易用、入门快功能单一微服务、分布式适配差适合小型单体项目2. 全文总结Spring Security 看似繁琐核心逻辑只有认证授权两大模块。新手入门只需掌握依赖整合、自定义用户认证、拦截规则配置进阶重点吃透前后端分离改造、JWT 无状态登录、注解权限控制生产落地需做好密码加密、统一返回、安全防护、动态权限与异常处理。作为 Spring 生态官方安全框架它是 Java 项目权限体系的标准答案掌握后可覆盖单体、微服务、第三方登录、分布式鉴权等所有业务场景是后端开发必备核心技能。