当前位置:   article > 正文

SpringSecurityOAuth已停更,来看一看进化版本Spring Authorization Server_spring-boot-starter-oauth2-authorization-server

spring-boot-starter-oauth2-authorization-server

Spring Authorization Server是Spring Security OAuth的进化版本,Spring Security OAuth官方已经宣布“End of Life”了。Spring Security OAuth使用的是OAuth2.0标准而Spring Authorization Serve引入了对OAuth 2.1和OpenID Connect 1.0规范的支持,并提供了更多功能和改进。它提供了OAuth 2.1和OpenID Connect 1.0规范以及其他相关规范的实现。它是基于Spring Security构建的,为构建OpenID Connect 1.0身份提供者和OAuth2授权服务器产品提供了安全、轻量级和可定制的基础。

OAuth 2.1和OpenID Connect 1.0是用于身份验证和授权的行业标准协议。它们被广泛应用于各种应用程序和系统,以实现安全的用户身份验证和授权流程。Spring Authorization Server提供了一个方便的方式来实现这些协议,使开发人员能够快速构建安全可靠的身份验证和授权系统。

在本教程中,我们将介绍如何使用 Spring Boot 快速入门 Spring Authorization Server。

系统要求

在开始之前,您需要确保满足以下系统要求:

  • Java 17 或更高版本的运行时环境。

安装 Spring Authorization Server

首先,我们需要创建一个基于 Spring Boot 的项目,并添加 Spring Authorization Server 的依赖。

  1. 打开 start.spring.io,选择所需的项目配置,例如项目语言、构建工具和依赖管理器。
  2. 在依赖搜索框中输入 "spring-boot-starter-oauth2-authorization-server",并添加该依赖。
  • Maven
  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
  4. </dependency>
  • Gradle
implementation "org.springframework.security:spring-security-oauth2-authorization-server"

官方的版本可以选择1.1.0

  1. 下载生成的项目代码,并导入到您的开发环境中。

配置 Spring Authorization Server

一旦您的项目设置完毕,接下来需要进行一些配置以启用 Spring Authorization Server。

  1. 打开项目的 application.yml 文件。
  2. 添加以下配置内容:
  1. server:
  2. port: 9000
  3. logging:
  4. level:
  5. org.springframework.security: trace
  6. spring:
  7. security:
  8. oauth2:
  9. authorizationserver:
  10. client:
  11. oidc-client:
  12. registration:
  13. client-id: "oidc-client"
  14. client-secret: "{noop}secret"
  15. client-authentication-methods:
  16. - "client_secret_basic"
  17. authorization-grant-types:
  18. - "authorization_code"
  19. - "refresh_token"
  20. - "client_credentials"
  21. redirect-uris:
  22. - "http://127.0.0.1:8080/login/oauth2/code/oidc-client"
  23. post-logout-redirect-uris:
  24. - "http://127.0.0.1:8080/"
  25. scopes:
  26. - "openid"
  27. - "profile"
  28. require-authorization-consent: true

以上配置包含了一些必要的属性,例如服务器端口、客户端配置和授权相关设置。您可以根据自己的需求进行自定义配置。

开发您的第一个应用程序

现在,您可以开始编写您的第一个 Spring Authorization Server 应用程序了。

  1. 创建一个新的 Java 类,例如 AuthorizationServerConfig。
  2. 在类上添加 @Configuration 和 @EnableWebSecurity 注解。
  3. 定义以下必要的组件作为 @Bean:
  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig {
  4. /**
  5. * 配置授权服务相关端点
  6. * 负责处理与授权服务器相关的安全配置
  7. *
  8. */
  9. @Bean
  10. @Order(1)
  11. public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http)
  12. throws Exception {
  13. OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
  14. http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
  15. .oidc(Customizer.withDefaults()); // 启用 OpenID Connect 1.0
  16. http
  17. // 当未经过身份验证时,重定向到登录页面
  18. .exceptionHandling((exceptions) -> exceptions
  19. .defaultAuthenticationEntryPointFor(
  20. new LoginUrlAuthenticationEntryPoint("/login"),
  21. new MediaTypeRequestMatcher(MediaType.TEXT_HTML)
  22. )
  23. )
  24. // 接受访问令牌用于用户信息和/或客户端注册
  25. .oauth2ResourceServer((resourceServer) -> resourceServer
  26. .jwt(Customizer.withDefaults()));
  27. return http.build();
  28. }
  29. /**
  30. * 配置资源相关端点
  31. * 通用的过滤器链,用于处理整个应用程序的安全配置
  32. */
  33. @Bean
  34. @Order(2)
  35. public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)
  36. throws Exception {
  37. http
  38. .authorizeHttpRequests((authorize) -> authorize
  39. .anyRequest().authenticated()
  40. )
  41. // 表单登录处理授权服务器过滤器链的重定向
  42. .formLogin(Customizer.withDefaults());
  43. return http.build();
  44. }
  45. @Bean
  46. public UserDetailsService userDetailsService() {
  47. UserDetails userDetails = User.withDefaultPasswordEncoder()
  48. .username("user")
  49. .password("password")
  50. .roles("USER")
  51. .build();
  52. return new InMemoryUserDetailsManager(userDetails);
  53. }
  54. @Bean
  55. public RegisteredClientRepository registeredClientRepository() {
  56. RegisteredClient oidcClient = RegisteredClient.withId(UUID.randomUUID().toString())
  57. .clientId("oidc-client")
  58. .clientSecret("{noop}secret")
  59. .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
  60. .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
  61. .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
  62. .redirectUri("http://127.0.0.1:8080/login/oauth2/code/oidc-client")
  63. .postLogoutRedirectUri("http://127.0.0.1:8080/")
  64. .scope(OidcScopes.OPENID)
  65. .scope(OidcScopes.PROFILE)
  66. .clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build())
  67. .build();
  68. return new InMemoryRegisteredClientRepository(oidcClient);
  69. }
  70. //JWK是一种JSON格式的密钥表示,用于描述加密算法使用的密钥。
  71. //JWT使用JWK进行签名和验证,确保令牌的真实性和完整性。
  72. @Bean
  73. public JWKSource<SecurityContext> jwkSource() {
  74. KeyPair keyPair = generateRsaKey();
  75. RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
  76. RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
  77. RSAKey rsaKey = new RSAKey.Builder(publicKey)
  78. .privateKey(privateKey)
  79. .keyID(UUID.randomUUID().toString())
  80. .build();
  81. JWKSet jwkSet = new JWKSet(rsaKey);
  82. return new ImmutableJWKSet<>(jwkSet);
  83. }
  84. private static KeyPair generateRsaKey() {
  85. KeyPair keyPair;
  86. try {
  87. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  88. keyPairGenerator.initialize(2048);
  89. keyPair = keyPairGenerator.generateKeyPair();
  90. }
  91. catch (Exception ex) {
  92. throw new IllegalStateException(ex);
  93. }
  94. return keyPair;
  95. }
  96. @Bean
  97. public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
  98. return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
  99. }
  100. @Bean
  101. public AuthorizationServerSettings authorizationServerSettings() {
  102. return AuthorizationServerSettings.builder().build();
  103. }
  104. }

以上代码配置了 Spring Authorization Server 的一些必要组件,包括 HTTP 安全配置、密码编码器、认证管理器、JWT 访问令牌转换器、令牌存储和默认令牌服务。

  1. authorizationServerSecurityFilterChain用于协议端点的Spring Security过滤器链。 这个过滤器链用于处理与协议端点相关的请求和响应。它负责处理OAuth2和OpenID Connect的协议细节,例如授权请求、令牌颁发和验证等。
  2. defaultSecurityFilterChain用于身份验证的Spring Security过滤器链。 这个过滤器链用于处理身份验证相关的请求和响应。它负责验证用户的身份,并生成相应的凭据,以便后续的授权和访问控制。
  3. UserDetailsService的实例,用于获取需要进行身份验证的用户信息。 这个实例用于从用户存储中检索用户的详细信息,例如用户名、密码和权限等。它提供了与用户相关的数据,以便进行身份验证和授权的决策。
  4. RegisteredClientRepository的实例,用于管理客户端信息。 这个实例用于管理OAuth2和OpenID Connect客户端的注册信息,包括客户端ID、密钥、授权类型和重定向URI等。它负责验证客户端的身份并维护客户端的配置。
  5. com.nimbusds.jose.jwk.source.JWKSource的实例,用于对访问令牌进行签名。 这个实例用于生成和管理用于对访问令牌进行签名的JSON Web Key(JWK)。它提供了加密算法和密钥,以确保访问令牌的完整性和安全性。
  6. java.security.KeyPair的实例,用于在启动时生成密钥,并用于创建上述JWKSource。 这个实例用于生成公钥和私钥对,作为访问令牌签名所需的密钥材料。它提供了安全的密钥生成机制,以确保访问令牌的安全性和保密性。
  7. JwtDecoder的实例,用于解码已签名的访问令牌。 这个实例用于验证和解码已签名的访问令牌,以获取其中包含的授权信息和用户身份。它负责验证访问令牌的有效性和真实性。
  8. AuthorizationServerSettings的实例,用于配置Spring Authorization Server的设置。 这个实例用于配置Spring Authorization Server的一些全局设置,例如访问令牌的有效期、刷新令牌的策略和认证页面的URL等。它提供了对授权服务器行为的细粒度控制。

运行应用程序

现在,您已经完成了 Spring Authorization Server 的基本配置。您可以通过运行您的应用程序来启动服务器:

  1. 在项目中找到 Application 类,其中包含 main 方法。
  2. 运行 Application.main() 方法。

运行应用程序后,可以使用 OAuth 2.1 客户端来请求访问令牌,并使用访问令牌来访问受保护的资源。如:

以上是一个简单的 Spring Boot OAuth 2.0 的 demo 示例,仅供参考。在实际开发中,需要根据具体业务需求和安全要求进行相应的配置和实现。

相关demo源代码

  • Spring Authorization Server官方demo(基于springboot)

https://github.com/spring-projects/spring-authorization-server/tree/main/samples#demo-sample

  • Spring Security官方demo(基于springboot)

https://github.com/spring-projects/spring-security-samples/tree/main/servlet/spring-boot/java/oauth2

运行效果

登录页面

  • 登录后主页面

通过授权码模式获取resource

通过Device Activation模式获取resource

====================================

如果文章对你有帮忙,请不要忘记加个关注、点个赞!必回关!!!

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

闽ICP备14008679号