微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OAuth2FeignRequestInterceptor 的替代方案,因为它现在已被弃用

如何解决OAuth2FeignRequestInterceptor 的替代方案,因为它现在已被弃用

在我之前的实现中,我使用的是 OAuth2FeignRequestInterceptor。但是从 Spring security 5 开始,OAuth2FeignRequestInterceptor 似乎已被弃用。实现相同目标的替代方法是什么?我搜索了很多博客主题,但找不到任何答案。

解决方法

build.gradle.kts

implementation("org.springframework.security:spring-security-oauth2-client")

应用程序.yml

spring:
  security:
    oauth2:
      client:
        registration:
          keycloak: // <- replace with your custom oauth2 client details
            provider: keycloak
            client-id: [keycloak-client-id]
            client-secret: [keycloak-client-secret]
            authorization-grant-type: client_credentials
            scope: openid
        provider:
          keycloak: // <- replace with your custom oauth2 provider details
            authorization-uri: http://localhost:8080/auth/realms/yourealm/protocol/openid-connect/auth
            token-uri: http://localhost:8080/auth/realms/yourealm/protocol/openid-connect/token

Oauth2Config

@Configuration
class Oauth2Config {
  @Bean
  fun authorizedClientManager(
    clientRegistrationRepository: ClientRegistrationRepository?,authorizedClientRepository: OAuth2AuthorizedClientRepository?
  ): OAuth2AuthorizedClientManager? {
    val authorizedClientProvider: OAuth2AuthorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder()
      .authorizationCode()
      .clientCredentials()
      .build()
    val authorizedClientManager = DefaultOAuth2AuthorizedClientManager(clientRegistrationRepository,authorizedClientRepository)
    authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider)

    return authorizedClientManager
  }
}

FeignOauth2Configuration

class FeignOauth2Configuration (private val authorizedClientManager: OAuth2AuthorizedClientManager) {
  @Bean
  fun oauth2HttpRequestInterceptor(): RequestInterceptor {
    return RequestInterceptor { request ->
      request.headers()["Authorization"] = listOf("Bearer ${getAccessToken()?.tokenValue}")
    }
  }

  private fun getAccessToken(): OAuth2AccessToken? {
    val request = OAuth2AuthorizeRequest
      .withClientRegistrationId("keycloak")
      .principal("client-id")
      .build()
    return authorizedClientManager.authorize(request)?.accessToken
  }
}

用户客户端

@FeignClient(name="user-service",configuration = [FeignOauth2Configuration::class])
interface UserClient {
  @GetMapping("/users")
  fun getAllUsers(): List<UserDto>
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。