spring security 超详细使用教程(接入springboot、前后端分离)
Spring Security 超详细使用教程接入 Spring Boot 与前后端分离引言Spring SecuritySpring Boot 安全的“守护神”Spring Security 是 Spring 生态中处理认证Authentication和授权Authorization的强大框架它无缝集成 Spring Boot提供从基本认证到 OAuth2 的全面解决方案。在前后端分离架构中如 React/Vue 前端 Spring Boot 后端Spring Security 常结合 JWTJSON Web Token实现无状态认证避免传统 Session 的跨域问题。根据官方指南Spring Security 能轻松保护 REST API确保只有授权用户访问资源。 2026 年随着 Spring Boot 3.x 的普及这一框架支持虚拟线程和 GraalVM Native 编译提升了性能和安全性。本教程从基础接入入手逐步深入前后端分离实战覆盖依赖、配置、JWT 集成和常见坑。目标读完后你能独立构建一个安全的 API 系统提升应用安全性 50%。预计阅读时长30 分钟。准备 IntelliJ IDEA 和 Maven立即新建 Spring Boot 项目测试基本认证核心概念Spring Security 基础速览Spring Security 的核心是过滤器链Filter Chain它拦截请求处理认证/授权。以下表格对比关键概念基于 Spring Security 6.x兼容 Boot 3.x概念定义与作用关键组件/注解前后端分离适用性常见误区认证Authentication验证用户身份如用户名/密码、JWTUserDetailsService, AuthenticationManager高用 JWT 令牌替换 Session忽略密码加密BCrypt授权Authorization检查权限如角色/方法级PreAuthorize, SecurityFilterChain高基于 JWT 声明claims过度配置导致性能瓶颈过滤器链拦截请求的过滤器序列HttpSecurity 配置中自定义 JWT 过滤器默认启用 CSRF 冲突 CORSJWT 集成无状态令牌用于前后端分离JwtAuthenticationToken高API 首选密钥泄露/过期未处理OAuth2第三方登录如 GoogleEnableOAuth2Client高社交登录配置 issuer-uri 错误解读前后端分离时禁用 Sessionstateless用 JWT 携带用户信息。默认 Spring Security 启用基本认证需自定义配置。依赖与项目准备步骤1创建 Spring Boot 项目使用 Spring Initializrhttps://start.spring.io生成项目选择 Spring Boot 3.x、Java 21、Maven。添加依赖Webspring-boot-starter-web、Securityspring-boot-starter-security、JWTspring-boot-starter-oauth2-resource-server 或 jjwt。pom.xml 示例dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-security/artifactId/dependencydependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-oauth2-resource-server/artifactId/dependencydependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-oauth2-jose/artifactId/dependencydependency!-- JWT 解析 --groupIdio.jsonwebtoken/groupIdartifactIdjjwt-api/artifactIdversion0.12.3/version/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-impl/artifactIdversion0.12.3/versionscoperuntime/scope/dependencydependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt-jackson/artifactIdversion0.12.3/versionscoperuntime/scope/dependency/dependencies步骤2基本配置添加 Security 后Spring Boot 默认启用基本认证用户名 user密码控制台打印。测试运行应用访问 http://localhost:8080弹出登录框。基础认证配置用户名/密码验证步骤3自定义用户服务创建 UserDetailsService 实现类加载用户数据可从数据库。代码示例SecurityConfig.javaimportorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.core.userdetails.User;importorg.springframework.security.core.userdetails.UserDetails;importorg.springframework.security.core.userdetails.UserDetailsService;importorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;importorg.springframework.security.crypto.password.PasswordEncoder;importorg.springframework.security.provisioning.InMemoryUserDetailsManager;importorg.springframework.security.web.SecurityFilterChain;ConfigurationpublicclassSecurityConfig{BeanpublicPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();// 密码加密}BeanpublicUserDetailsServiceuserDetailsService(){UserDetailsuserUser.withUsername(admin).password(passwordEncoder().encode(123456)).roles(ADMIN).build();returnnewInMemoryUserDetailsManager(user);// 内存用户生产用数据库}BeanpublicSecurityFilterChainsecurityFilterChain(HttpSecurityhttp)throwsException{http.authorizeHttpRequests(auth-auth.requestMatchers(/public/**).permitAll()// 公开路径.anyRequest().authenticated()// 其他需认证).formLogin(form-form// 表单登录.loginPage(/login)// 自定义登录页前后端分离可忽略.permitAll()).logout(logout-logout.permitAll());returnhttp.build();}}测试访问受保护路径输入 admin/123456 登录。前后端分离JWT 认证集成前后端分离时禁用表单登录和 CSRF用 JWT 处理认证。步骤4JWT 配置创建 JWT 工具类importio.jsonwebtoken.*;importjava.util.Date;publicclassJwtUtils{privatestaticfinalStringSECRETyour_secret_key;// 密钥privatestaticfinallongEXPIRATION86400000;// 1天publicstaticStringgenerateToken(Stringusername){returnJwts.builder().setSubject(username).setExpiration(newDate(System.currentTimeMillis()EXPIRATION)).signWith(Keys.hmacShaKeyFor(SECRET.getBytes())).compact();}publicstaticStringgetUsernameFromToken(Stringtoken){returnJwts.parserBuilder().setSigningKey(Keys.hmacShaKeyFor(SECRET.getBytes())).build().parseClaimsJws(token).getBody().getSubject();}publicstaticbooleanvalidateToken(Stringtoken){try{Jwts.parserBuilder().setSigningKey(Keys.hmacShaKeyFor(SECRET.getBytes())).build().parseClaimsJws(token);returntrue;}catch(Exceptione){returnfalse;}}}步骤5自定义 JWT 过滤器更新 SecurityConfig// ... 省略前部分BeanpublicSecurityFilterChainsecurityFilterChain(HttpSecurityhttp)throwsException{http.csrf(csrf-csrf.disable())// 前后端分离禁用 CSRF.sessionManagement(session-session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))// 无状态.authorizeHttpRequests(auth-auth.requestMatchers(/login).permitAll().anyRequest().authenticated()).addFilterBefore(newJwtAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class);// 自定义过滤器returnhttp.build();}JwtAuthenticationFilter.javaimportjakarta.servlet.FilterChain;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpServletResponse;importorg.springframework.security.authentication.UsernamePasswordAuthenticationToken;importorg.springframework.security.core.context.SecurityContextHolder;importorg.springframework.security.core.userdetails.UserDetails;importorg.springframework.web.filter.OncePerRequestFilter;publicclassJwtAuthenticationFilterextendsOncePerRequestFilter{OverrideprotectedvoiddoFilterInternal(HttpServletRequestrequest,HttpServletResponseresponse,FilterChainfilterChain)throwsException{Stringtokenrequest.getHeader(Authorization);if(token!nulltoken.startsWith(Bearer )){tokentoken.substring(7);if(JwtUtils.validateToken(token)){StringusernameJwtUtils.getUsernameFromToken(token);// 从UserDetailsService加载用户UserDetailsuserDetailsuserDetailsService().loadUserByUsername(username);UsernamePasswordAuthenticationTokenauthnewUsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(auth);}}filterChain.doFilter(request,response);}}步骤6登录接口生成 JWTLoginController.javaimportorg.springframework.security.authentication.AuthenticationManager;importorg.springframework.security.authentication.UsernamePasswordAuthenticationToken;importorg.springframework.security.core.Authentication;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RestController;RestControllerpublicclassLoginController{privatefinalAuthenticationManagerauthenticationManager;publicLoginController(AuthenticationManagerauthenticationManager){this.authenticationManagerauthenticationManager;}PostMapping(/login)publicStringlogin(RequestBodyLoginRequestrequest){AuthenticationauthenticationauthenticationManager.authenticate(newUsernamePasswordAuthenticationToken(request.getUsername(),request.getPassword()));returnJwtUtils.generateToken(request.getUsername());}}publicclassLoginRequest{privateStringusername;privateStringpassword;// getters/setters}前端用 Axios 发送 POST /login获取 JWT后续请求加 Header: Authorization: Bearer {token}。授权与方法级安全步骤7角色授权在 SecurityConfig 加EnableMethodSecurity。Controller 示例RestControllerpublicclassAdminController{GetMapping(/admin)PreAuthorize(hasRole(ADMIN))// 方法级授权publicStringadmin(){returnAdmin Access;}}常见问题与优化CORS前后端分离加 CORS 配置BeanpublicCorsConfigurationSourcecorsConfigurationSource(){CorsConfigurationconfignewCorsConfiguration();config.setAllowedOrigins(List.of(http://localhost:3000));// 前端地址config.setAllowedMethods(List.of(GET,POST,PUT,DELETE));config.setAllowedHeaders(List.of(*));UrlBasedCorsConfigurationSourcesourcenewUrlBasedCorsConfigurationSource();source.registerCorsConfiguration(/**,config);returnsource;}性能大表 JWT 验证用缓存生产用 RSA 密钥签名。OAuth2扩展到第三方登录配置 issuer-uri 和 client-id g rok:render type“render_inline_citation”9/grok:render。结语Spring Security构建安全的 API 堡垒从基本认证到 JWT 前后端分离Spring Security 让安全配置变得优雅而强大——在春川的春日午后当前 KST 11:302026.3.7试着运行这个配置Postman 测试 /login 获取 JWT你将感受到安全的脉动实践挑战集成数据库用户存储。需 OAuth2 扩展或代码调试分享你的项目细节我帮优化。参考Spring 官方指南与 Baeldung 教程。 Go secure, build robust

相关新闻

【大数据毕设源码分享】基于springboot+数据可视化的智能农业管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【大数据毕设源码分享】基于springboot+数据可视化的智能农业管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/5/17 9:28:43 阅读更多 →
【大数据毕设全套源码+文档】基于springboot+大数据技术的招聘数据可视化系统的设计与实现(丰富项目+远程调试+讲解+定制)

【大数据毕设全套源码+文档】基于springboot+大数据技术的招聘数据可视化系统的设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 12:48:51 阅读更多 →
频串联谐振耐压装置选型全指南

频串联谐振耐压装置选型全指南

串联谐振耐压装置是电力电缆、GIS、变压器、发电机等高压设备交流耐压试验的核心设备,选型的核心原则是:以被试品参数为核心,以国标试验标准为依据,兼顾适配性、便携性、安全性与拓展性,杜绝“小马拉大车”或过度冗余造…

2026/7/4 11:10:00 阅读更多 →

最新新闻

你的前端代码打包后究竟经历了什么?

你的前端代码打包后究竟经历了什么?

打包命令执行的一瞬间,构建工具并不会立刻编译代码,第一步永远是读取并整合所有配置规则。构建工具配置读取: 以 Vite 为例,工具会自动查找项目根目录 vite.config.js,读取入口文件、输出目录、打包策略、公共路径等核…

2026/7/6 3:50:11 阅读更多 →
[实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片

[实例] SPI接口的ADC芯片全通道纯硬件驱动——基于HAL库和TLA2518芯片

本次需要通过TI的TL2518芯片进行ADC采样。该芯片为SPI接口,具有八个通道,可以全部配置成AIN进行采样,本次需要探究如何该如何配置才能将芯片的采样率达到最大。1.TLA2158首先要陈列一下该芯片的一些特性,为节省篇幅,此…

2026/7/6 3:48:11 阅读更多 →
【全文系列目录】风控PM记

【全文系列目录】风控PM记

风控PM记 一:风险认知与识别(入门篇) ① 入门第一课:认识风险,了解风控 ② 入门第二课:业务催生风险,常见的业务风险有哪些? ③ 《电商风控入门:我们到底在“防”什…

2026/7/6 3:48:11 阅读更多 →
基于Databricks的企业级AI Agent生产实践:从架构设计到部署运维

基于Databricks的企业级AI Agent生产实践:从架构设计到部署运维

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在考虑将AI Agent引入企业生产环境,可能会面临这样的困境:在本地开发环境中跑得飞快的Agent原型&…

2026/7/6 3:42:09 阅读更多 →
飞书卡片表格渲染踩坑记:从 Markdown 到原生 table 组件的迁移实战

飞书卡片表格渲染踩坑记:从 Markdown 到原生 table 组件的迁移实战

背景 团队每日通过飞书推送项目晨报和日报,内容从项目管理平台实时拉取,包含任务统计、进度列表、风险项等多维数据,天然需要表格来承载。 最初的实现方案是飞书消息推送 纯文本,格式简陋,阅读体验差。于是决定升级为…

2026/7/6 3:40:09 阅读更多 →
构建AI毒舌投资人:用Prompt工程验证副业想法的可行性

构建AI毒舌投资人:用Prompt工程验证副业想法的可行性

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在折腾各种 AI 工具时,我发现一个挺有意思的现象:很多人拿到一个强大的 AI 模型,比如 DeepSee…

2026/7/6 3:40:09 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻