当前位置:   article > 正文

将Spring Cloud Gateway 与OAuth2模式一起使用_gateway集成oauth2

gateway集成oauth2

概述

Spring Cloud Gateway是一个构建在 Spring 生态之上的 API Gateway。 建立在Spring Boot 2.xSpring WebFluxProject Reactor之上。

本节中您将使用Spring Cloud Gateway将请求路由到Servlet API服务。

本文您将学到

  • OpenID Connect 身份验证 - 用于用户身份验证
  • 令牌中继 - Spring Cloud Gateway API网关充当客户端将令牌转发到资源请求上

先决条件

  • Java 8+
  • MySQL
  • Redis

OpenID Connect身份验证

OpenID Connect 定义了一种基于 OAuth2 授权代码流的最终用户身份验证机制。下图是Spring Cloud Gateway与授权服务进行身份验证完整流程,为了清楚起见,其中一些参数已被省略。

创建授权服务

本节中我们将使用Spring Authorization Server 构建授权服务,支持OAuth2协议与OpenID Connect协议。同时我们还将使用RBAC0基本权限模型控制访问权限。并且该授权服务同时作为OAuth2客户端支持Github第三方登录。

相关数据库表结构

我们创建了基本RBAC0权限模型用于本文示例讲解,并提供了OAuth2授权服务持久化存储所需表结构和OAuth2客户端持久化存储所需表结构。通过oauth2_client_role定义外部系统角色与本平台角色映射关系。涉及相关创建表及初始化数据的SQL语句可以从这里获取。

角色说明

本节中授权服务默认提供两个角色,以下是角色属性及访问权限:

read write
ROLE_ADMIN
ROLE_OPERATION

Maven依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. <version>2.6.7</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.security</groupId>
  8. <artifactId>spring-security-oauth2-authorization-server</artifactId>
  9. <version>0.3.1</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-oauth2-client</artifactId>
  14. <version>2.6.7</version>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. <version>2.6.7</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-jdbc</artifactId>
  24. <version>2.6.7</version>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-data-jpa</artifactId>
  29. <version>2.6.7</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>mysql</groupId>
  33. <artifactId>mysql-connector-java</artifactId>
  34. <version>8.0.21</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>com.alibaba</groupId>
  38. <artifactId>druid-spring-boot-starter</artifactId>
  39. <version>1.2.3</version>
  40. </dependency>

配置

首先我们从application.yml配置开始,这里我们指定了端口号与MySQL连接配置:

  1. server:
  2. port: 8080
  3. spring:
  4. datasource:
  5. druid:
  6. db-type: mysql
  7. driver-class-name: com.mysql.cj.jdbc.Driver
  8. url: jdbc:mysql://localhost:3306/oauth2server?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
  9. username: <<username>> # 修改用户名
  10. password: <<password>> # 修改密码

接下来我们将创建AuthorizationServerConfig,用于配置OAuth2及OIDC所需Bean,首先我们将新增OAuth2客户端信息,并持久化到数据库:

  1. @Bean
  2. public RegisteredClientRepository registeredClientRepository(JdbcTemplate jdbcTemplate) {
  3. RegisteredClient registeredClient = RegisteredClient.withId("relive-messaging-oidc")
  4. .clientId("relive-client")
  5. .clientSecret("{noop}relive-client")
  6. .clientAuthenticationMethods(s -> {
  7. s.add(ClientAuthenticationMethod.CLIENT_SECRET_POST);
  8. s.add(ClientAuthenticationMethod.CLIENT_SECRET_BASIC);
  9. })
  10. .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
  11. .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
  12. .redirectUri("http://127.0.0.1:8070/login/oauth2/code/messaging-gateway-oidc")
  13. .scope(OidcScopes.OPENID)
  14. .scope(OidcScopes.PROFILE)
  15. .scope(OidcScopes.EMAIL)
  16. .scope("read")
  17. .clientSettings(ClientSettings.builder()
  18. .requireAuthorizationConsent(false) //不需要授权同意
  19. .requireProofKey(false)
  20. .build())
  21. .tokenSettings(TokenSettings.builder()
  22. .accessTokenFormat(OAuth2TokenFormat.SELF_CONTAINED) // 生成JWT令牌
  23. .idTokenSignatureAlgorithm(SignatureAlgorithm.RS256)
  24. .accessTokenTimeToLive(Duration.ofSeconds(30 * 60))//accessTokenTimeToLive:access_token有效期
  25. .refreshTokenTimeToLive(Duration.ofSeconds(60 * 60))//refreshTokenTimeToLive:refresh_token有效期
  26. .reuseRefreshTokens(true)
  27. .build())
  28. .build();
  29. JdbcRegisteredClientRepository registeredClientRepository = new JdbcRegisteredClientRepository(jdbcTemplate);
  30. registeredClientRepository.save(registeredClient);
  31. return registeredClientRepository;
  32. }

其次我们将创建授权过程中所需持久化容

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/84497
推荐阅读
相关标签
  

闽ICP备14008679号