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

举报
bug菌 发表于 2025/08/25 21:16:00 2025/08/25
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 🔒 前言 💪在现代 Web 应用中,安全性是至关重要的,Sprin...

🏆本文收录于「滚雪球学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 应用免受未经授权的访问。

实战案例:配置基本的身份验证和授权

  1. 添加 Spring Security 依赖

    pom.xml 中添加 Spring Security 相关的依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
  2. 配置基本身份验证和授权

    使用 @EnableWebSecurityWebSecurityConfigurerAdapter 配置 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 实现无状态认证

  1. 添加依赖

    pom.xml 中添加 JWT 相关的依赖:

    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.11.5</version>
    </dependency>
    
  2. 创建 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();
        }
    }
    
  3. 配置 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,验证其有效性,并设置用户身份。

  4. 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)

  1. 添加 OAuth 2.0 客户端依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
    
  2. 配置 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
    
  3. 启用 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 保护

  1. 启用 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();
        }
    }
    
  2. 定制 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-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。