Spring Cloud Security:OAuth2、JWT 认证与授权在微服务中的应用!

举报
bug菌 发表于 2025/03/20 21:04:23 2025/03/20
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 🎯 前言:微服务架构中的安全防护随着微服务架构的广泛应用,如何保障系...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

🎯 前言:微服务架构中的安全防护

随着微服务架构的广泛应用,如何保障系统的安全性成为了开发者必须关注的问题。在传统的单体应用中,安全防护可以通过简单的会话管理来解决,但在微服务架构下,服务间通信复杂,用户身份验证、授权管理以及数据安全问题变得愈加棘手。

为了应对这些挑战,Spring Cloud Security 提供了多种解决方案,尤其是在 OAuth2JWT 认证与授权方面提供了强有力的支持。本篇文章将介绍 OAuth2 认证的基本概念、如何结合 JWT 进行身份认证与授权、如何利用 Spring Security 保护微服务,并且深入探讨如何结合 Spring Cloud Gateway 进行统一认证与授权的管理。

📌 1. OAuth2 介绍:现代认证与授权的解决方案

🔐 1.1 什么是 OAuth2?

OAuth2(Open Authorization 2.0)是一个授权框架,允许第三方应用程序在用户授权的情况下,访问存储在其他服务提供商平台上的用户资源。OAuth2 是目前 Web 应用和移动应用中 最常用的认证与授权协议,它允许服务提供商对应用进行访问控制,而无需暴露用户的凭证(如用户名和密码)。

OAuth2 定义了 授权码客户端凭证密码授权隐式授权等多种授权方式,以支持不同类型的客户端和安全要求。常见的 OAuth2 用法包括:

  • 用户授权:用户通过授权,让第三方应用获取访问他们资源的权限。
  • 客户端授权:应用使用自身的身份信息直接请求访问令牌。

🔐 1.2 OAuth2 的核心组件

OAuth2 框架主要包含以下几个核心角色:

  • 资源拥有者(Resource Owner):通常是最终用户,拥有资源的所有权。
  • 资源服务器(Resource Server):存储用户资源的服务,能够处理授权令牌并响应资源请求。
  • 客户端(Client):需要访问资源服务器的应用。
  • 授权服务器(Authorization Server):负责处理认证和授权,颁发访问令牌。

🔐 1.3 OAuth2 授权流程

OAuth2 的授权流程通常包括以下几个步骤:

  1. 客户端向授权服务器请求授权:客户端通过浏览器或应用请求用户授权。
  2. 用户授权:用户登录授权服务器并同意授予客户端访问权限。
  3. 授权码获取:如果是 授权码授权 类型,授权服务器会返回一个授权码。
  4. 客户端获取令牌:客户端将授权码发送给授权服务器,并换取访问令牌(Access Token)。
  5. 访问资源:客户端用访问令牌请求资源服务器,获得授权访问资源。

🛠 2. JWT 认证与授权:如何结合 OAuth2 实现无状态认证

🎯 2.1 什么是 JWT(JSON Web Token)?

JWT(JSON Web Token)是一种开放标准(RFC 7519),它定义了一种简洁的方式,用于在各方之间传递信息。JWT 主要用于用户身份验证和信息交换,通常与 OAuth2 协议一起使用。

JWT 通常包含以下三部分:

  1. 头部(Header):通常由两部分组成,令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。
  2. 有效载荷(Payload):包含声明(Claims),声明是 JWT 中的主体部分,常见的声明包括用户身份信息、权限、过期时间等。
  3. 签名(Signature):为了保证 JWT 的完整性和防篡改,签名通过指定的算法加密头部和有效载荷。

🎯 2.2 如何使用 JWT 实现 OAuth2 认证与授权

JWT 是一种 无状态认证 的解决方案,令牌本身包含了用户的所有信息,服务器不需要存储任何会话状态。JWT 被广泛应用于 OAuth2 认证中,作为授权服务器颁发的访问令牌。

JWT 的优势包括:

  • 无状态:JWT 的信息是自包含的,不需要服务器存储会话数据。
  • 跨平台支持:JWT 是基于 JSON 格式的,可以在不同的平台和语言中传递。
  • 高效性:JWT 是 URL-safe 的,适合在 HTTP 请求中传递,如 HTTP Header。

🎯 2.3 使用 Spring Security 配置 JWT 认证

在 Spring Boot 中结合 Spring Security 使用 JWT 进行身份认证和授权是非常常见的做法。我们需要为 Spring Security 配置一个 JWT 的过滤器,在用户每次请求时进行 JWT 验证。

以下是如何通过 Spring Security 和 JWT 实现认证与授权的步骤:

  1. 添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.5</version>
</dependency>
  1. JWT 生成与解析工具类
public class JwtTokenUtil {
    private String secretKey = "yourSecretKey";

    // 生成JWT
    public String generateToken(UserDetails userDetails) {
        return Jwts.builder()
                .setSubject(userDetails.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }

    // 从 JWT 获取用户名
    public String extractUsername(String token) {
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    // 验证JWT是否有效
    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();
    }
}
  1. Spring Security 配置

在 Spring Security 中创建一个 JwtAuthenticationFilter,用于在请求中验证 JWT。

public class JwtAuthenticationFilter extends OncePerRequestFilter {
    private JwtTokenUtil jwtTokenUtil;

    @Autowired
    public JwtAuthenticationFilter(JwtTokenUtil jwtTokenUtil) {
        this.jwtTokenUtil = jwtTokenUtil;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = request.getHeader("Authorization");

        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            String username = jwtTokenUtil.extractUsername(token);

            if (username != null) {
                // 进行用户认证和权限检查
                // 设置 Authentication
            }
        }

        filterChain.doFilter(request, response);
    }
}
  1. 配置 Spring Security

SecurityConfig 中配置过滤器和授权规则。

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    private JwtTokenUtil jwtTokenUtil;

    @Autowired
    public SecurityConfig(JwtTokenUtil jwtTokenUtil) {
        this.jwtTokenUtil = jwtTokenUtil;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated()
            .and()
            .addFilterBefore(new JwtAuthenticationFilter(jwtTokenUtil), UsernamePasswordAuthenticationFilter.class);
    }
}

🛡 3. 使用 Spring Security 保护微服务

Spring Security 是保护 Spring 微服务的标准框架,能够对微服务应用进行身份认证和权限控制。在微服务架构中,Spring Security 常常与 OAuth2JWT 配合使用,为微服务提供 集中式认证分布式授权

🛡 3.1 配置 OAuth2 客户端与资源服务器

Spring Security 提供了对 OAuth2 的原生支持,可以通过简单的配置将应用配置为 OAuth2 客户端或资源服务器。这里简要介绍如何配置为 OAuth2 资源服务器:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://auth-server.com/issuer
          jwk-set-uri: https://auth-server.com/jwk-set

🛡 3.2 配置 OAuth2 认证服务器

如果你还没有 OAuth2 认证服务器,可以使用 Spring Security 提供的 OAuth2 认证服务器功能,或者选择其他的 OAuth2 认证服务器,如 Keycloak

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(new InMemoryTokenStore())
                .authenticationManager(authenticationManager);
    }
}

🌐 4. 结合 Spring Cloud Gateway 进行统一认证与授权

🌐 4.1 Spring Cloud Gateway 概述

Spring Cloud Gateway 是 Spring 的微服务 API 网关,它提供了反向代理、路由转发、认证和授权等功能。通过结合 OAuth2JWT,Spring Cloud Gateway 可以作为集中的认证与授权网关,统一管理微服务的身份验证和权限控制。

🌐 4.2 配置 Spring Cloud Gateway 进行 OAuth2 认证

Spring Cloud Gateway 提供了内置的 OAuth2 过滤器,可以非常方便地将 OAuth2 集成到微服务中。

spring:
  cloud:
    gateway:
      routes:
        - id: service_route
          uri: lb://YOUR-SERVICE
          predicates:
            - Path=/service/**
          filters:
            - name: OAuth2Login

通过以上配置,Spring Cloud Gateway 会在转发请求之前执行 OAuth2 登录认证,并将认证信息转发到后端服务。

🎬 结语:保护微服务的核心安全机制

在微服务架构中,认证与授权是保障系统安全和合规性的关键环节。通过 Spring SecurityOAuth2JWT,我们可以实现灵活、可扩展的安全管理,保护系统免受未经授权的访问。同时,借助 Spring Cloud Gateway,可以实现统一的认证与授权管理,让多个微服务之间的身份验证更加高效与安全。

安全永远是一个持续的过程,在不断演化的微服务架构中,保持敏锐的安全意识,及时更新安全措施,才是保障系统可靠性和稳定性的基础。

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学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个月内不可修改。