Spring Boot 3.x 中的安全性:如何加强应用的安全性?

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
🔒 前言 💪
在现代 Web 应用中,安全性是至关重要的,Spring Boot 3.x 为我们提供了强大的 Spring Security 6.x 集成,使得配置和管理 Web 安全变得更加高效和灵活。无论是身份验证、授权机制,还是防止 CSRF 攻击,Spring Security 都提供了全面的解决方案。
今天,我们将深入探讨 Spring Boot 3.x 中的安全性,包括如何集成 Spring Security 6.x、实现 JWT 认证、使用 OAuth 2.0 实现单点登录(SSO),以及如何防止 跨站请求伪造(CSRF) 攻击。
2.3 Spring Boot 3.x 中的安全性
🛡️ 集成 Spring Security 6.x
配置基本的身份验证和授权
Spring Security 6.x 为 Spring Boot 3.x 提供了强大的安全功能,能够帮助我们轻松实现 身份验证(Authentication) 和 授权(Authorization)。通过与 Spring Boot 无缝集成,Spring Security 可以帮助我们保护 Web 应用免受未经授权的访问。
实战案例:配置基本的身份验证和授权
-
添加 Spring Security 依赖
在
pom.xml
中添加 Spring Security 相关的依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
-
配置基本身份验证和授权
使用
@EnableWebSecurity
和WebSecurityConfigurerAdapter
配置 Web 安全:@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login", "/register").permitAll() // 允许访问登录和注册页面 .anyRequest().authenticated() // 其他请求需要认证 .and() .formLogin() // 使用表单登录 .loginPage("/login") // 自定义登录页面 .permitAll() .and() .logout() .permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() // 使用内存身份验证(仅供演示) .withUser("user").password("{noop}password").roles("USER") .and() .withUser("admin").password("{noop}admin").roles("ADMIN"); } }
在这个配置中,我们启用了 表单登录 和 注销 功能,确保所有请求都必须经过身份验证,并且允许用户访问登录和注册页面。
🏅 认证与授权机制
基于 JWT 实现无状态认证
JWT(JSON Web Token)是一种流行的无状态认证机制,它通过在客户端保存 token,避免了传统的基于 session 的认证方式。Spring Security 6.x 完美支持 JWT,能够帮助开发者轻松实现无状态认证。
实战案例:基于 JWT 实现无状态认证
-
添加依赖
在
pom.xml
中添加 JWT 相关的依赖:<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.11.5</version> </dependency>
-
创建 JWT 生成和验证工具类
public class JwtTokenUtil { private String secretKey = "your-secret-key"; public String generateToken(String username) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // Token有效期为1小时 .signWith(SignatureAlgorithm.HS256, secretKey) .compact(); } public String extractUsername(String token) { return Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(token) .getBody() .getSubject(); } public boolean isTokenExpired(String token) { return extractExpiration(token).before(new Date()); } private Date extractExpiration(String token) { return Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(token) .getBody() .getExpiration(); } }
-
配置 Spring Security 使用 JWT
配置一个自定义的过滤器,拦截请求并验证 JWT Token:
@Configuration public class JwtSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtTokenUtil jwtTokenUtil; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login", "/register").permitAll() // 允许登录和注册访问 .anyRequest().authenticated() .and() .addFilterBefore(new JwtAuthenticationFilter(jwtTokenUtil), UsernamePasswordAuthenticationFilter.class); // 添加JWT认证过滤器 } }
JwtAuthenticationFilter
过滤器负责解析请求中的 JWT token,验证其有效性,并设置用户身份。 -
JWT 认证过滤器
public class JwtAuthenticationFilter extends OncePerRequestFilter { private JwtTokenUtil jwtTokenUtil; public JwtAuthenticationFilter(JwtTokenUtil jwtTokenUtil) { this.jwtTokenUtil = jwtTokenUtil; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = extractToken(request); if (token != null && jwtTokenUtil.isTokenExpired(token)) { String username = jwtTokenUtil.extractUsername(token); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, Collections.emptyList()); SecurityContextHolder.getContext().setAuthentication(authentication); } filterChain.doFilter(request, response); } private String extractToken(HttpServletRequest request) { String header = request.getHeader("Authorization"); if (header != null && header.startsWith("Bearer ")) { return header.substring(7); } return null; } }
通过这些步骤,我们成功地将 JWT 无状态认证 集成到了 Spring Boot 中。每次请求时,客户端都会将 JWT Token 附加到请求头中,Spring Security 会验证其有效性,确保请求者的身份。
使用 OAuth 2.0 实现单点登录(SSO)
OAuth 2.0 是一种广泛使用的授权框架,支持实现单点登录(SSO)。在 Spring Security 6.x 中,OAuth 2.0 与 SSO 集成变得更加简便,能够帮助我们实现跨应用的身份认证。
实战案例:使用 OAuth 2.0 实现单点登录(SSO)
-
添加 OAuth 2.0 客户端依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency>
-
配置 application.yml
配置 OAuth 2.0 提供商(例如,使用 Google OAuth 2.0 作为身份认证提供商):
spring: security: oauth2: client: registration: google: client-id: YOUR_GOOGLE_CLIENT_ID client-secret: YOUR_GOOGLE_CLIENT_SECRET scope: profile, email redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" authorization-grant-type: authorization_code client-name: Google provider: google: authorization-uri: https://accounts.google.com/o/oauth2/auth token-uri: https://oauth2.googleapis.com/token user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
-
启用 OAuth 2.0 登录
在
SecurityConfig
中启用 OAuth 2.0 登录:@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login", "/home").permitAll() // 允许访问登录和主页 .anyRequest().authenticated() .and() .oauth2Login(); // 启用 OAuth 2.0 登录 } }
通过这些配置,Spring Boot 应用就能支持通过 OAuth 2.0 实现的单点登录,用户可以使用 Google、Facebook 等提供商的账户进行认证。
🛡️ CSRF保护与跨站请求伪造防护
配置 Spring Security 的 CSRF 保护
跨站请求伪造(CSRF)是一种攻击方式,攻击者利用用户已经登录的身份,在未经授权的情况下执行恶意操作。Spring Security 默认启用 CSRF 保护,可以有效防止这类攻击。
实战案例:启用 CSRF 保护
-
启用 CSRF 保护
在 Spring Security 配置中启用 CSRF 保护,防止跨站请求伪造:
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().enable() // 启用 CSRF 保护 .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .permitAll(); } }
-
定制 CSRF 过滤器
如果你使用的是 REST API 或者前后端分离的应用,可以使用
csrf().disable()
来禁用 CSRF,或者使用 Token 方式来保护:@Configuration public class RestSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() // 禁用 CSRF 防护(通常用于REST API) .authorizeRequests() .anyRequest().authenticated() .and() .httpBasic(); // 使用基本认证 } }
通过这些设置,Spring Security 会保护应用免受 CSRF 攻击,确保请求的合法性。
🏁 结语:打造安全、无缝的应用体验
通过集成 Spring Security 6.x,我们能够为 Spring Boot 应用提供强大的安全保护。无论是基于 JWT 的无状态认证、OAuth 2.0 实现单点登录(SSO),还是配置 CSRF 防护,Spring Security 都为我们提供了非常方便的工具和机制,帮助我们确保应用的安全性。
如今,安全性已成为现代 Web 应用不可或缺的一部分,只有确保数据和用户的安全,我们的应用才能获得更好的信任和使用体验。快来使用这些功能,增强你应用的安全性吧!🔒🚀
希望这篇文章能帮助您理解 Spring Boot 3.x 中的安全性配置。如果有任何问题或需要进一步的帮助,随时告诉我!
🧧福利赠与你🧧
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
✨️ Who am I?
我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-
- 点赞
- 收藏
- 关注作者
评论(0)