在spring-security-oauth2:2.4.0.RELEASE
中,OAuth2RestTemplate
、OAuth2ProtectedResourceDetails
和ClientCredentialsAccessTokenProvider
等类别都已标示为已过时。
从这些类的javadoc中,它指向一个spring security migration guide,暗示人们应该迁移到核心的spring-security 5项目中,但是我很难找到如何在这个项目中实现我的用例。
如果您希望对应用程序的传入请求进行身份验证,并且希望使用第三方OAuth提供程序来验证身份,则所有文档和示例都讨论了与第三方OAuth提供程序的集成。
在我的用例中,我所要做的就是使用RestTemplate
向受OAuth保护的外部服务发出请求。目前,我创建了一个OAuth2ProtectedResourceDetails
,其中包含我的客户端ID和密码,并将其传递到OAuth2RestTemplate
。我还将一个自定义ClientCredentialsAccessTokenProvider
添加到OAuth2ResTemplate
中,它只是向令牌请求添加了一些额外的标头,这些标头是OAuth提供程序I'所需的。我正在使用。
在spring-security 5文档中,我发现有一节提到定制令牌请求,但这看起来又是在使用第三方OAuth提供程序对传入请求进行身份验证的上下文中。目前还不清楚如何将此方法与ClientHttpRequestInterceptor
之类的方法结合使用,以确保对外部服务的每个传出请求首先获得一个令牌,然后将该令牌添加到的请求。
同样在上面链接的迁移指南中,有一个OAuth2AuthorizedClientService
的参考,它说这对于在拦截器中使用是有用的,但这看起来又像是它依赖于ClientRegistrationRepository
之类的东西,如果你想使用该提供程序来确保传入的请求被验证,它似乎是维护第三方提供程序注册的地方。
有没有什么方法可以利用spring-security 5中的新功能来注册OAuth提供者,以便获得一个令牌来添加到来自我的应用程序的传出请求中?
5条答案
按热度按时间zpf6vheq1#
Spring Security 5.2.x的OAuth 2.0客户端功能不支持
RestTemplate
,而仅支持WebClient
。请参阅Spring安全参考:HTTP客户端支持
WebClient
集成(用于请求受保护的资源)此外,
RestTemplate
在未来的版本中将不再使用。请参阅RestTemplate javadoc:**注意:**从5.0开始,非阻塞、React式
org.springframework.web.reactive.client.WebClient
提供了RestTemplate
的现代替代方案,它对同步和异步以及流场景都提供了有效的支持。RestTemplate
将在未来的版本中被弃用,并且不会添加主要的新功能。有关更多详细信息和示例代码,请参见Spring Framework参考文档的WebClient
部分。因此,最好的解决方案是放弃
RestTemplate
而支持WebClient
。将
WebClient
用于客户端凭据流以编程方式或使用Sping Boot 自动配置来配置客户端注册和提供程序:
...以及
OAuth2AuthorizedClientManager
@Bean
:将
WebClient
示例配置为将ServerOAuth2AuthorizedClientExchangeFilterFunction
与提供的OAuth2AuthorizedClientManager
一起使用:现在,如果您尝试使用此
WebClient
示例发出请求,它将首先从授权服务器请求令牌,并将其包含在请求中。hk8txs482#
嗨,也许已经太晚了,但是Spring Security 5中仍然支持RestTemplate,对于非响应式应用程序,仍然使用RestTemplate,您需要做的只是正确配置Spring Security并创建迁移指南中提到的拦截器
使用以下配置来使用client_credentials流
application.yml
OauthResTemplate的配置
拦截器
这将在第一次调用时以及令牌过期时生成access_token。OAuth2AuthorizedClientManager将为您管理所有这些
4ktjp1zp3#
我发现@matt威廉姆斯的回答很有帮助。不过我想补充一下,以防有人想通过编程传递clientId和secret来配置WebClient。下面是如何完成的。
qgzx9mmu4#
上面来自@Anar Sultanov的回答帮助我达到了这一点,但是由于我必须向我的OAuth令牌请求添加一些额外的头部,我想我会提供一个完整的答案,说明我如何解决我的用例的问题。
配置提供程序详细信息
将以下内容添加到
application.properties
实作自订
ReactiveOAuth2AccessTokenResponseClient
由于这是服务器到服务器的通信,我们需要使用
ServerOAuth2AuthorizedClientExchangeFilterFunction
。而不是非React性的OAuth2AuthorizedClientManager
。因此当我们使用ReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider()
时(为了给予它提供用于进行OAuth2请求的提供程序),我们必须给它一个ReactiveOAuth2AuthorizedClientProvider
,而不是非React式OAuth2AuthorizedClientProvider
。安全参考文档如果您使用非React式DefaultClientCredentialsTokenResponseClient
,则可以使用.setRequestEntityConverter()
方法来更改OAuth2令牌请求,但React式等效WebClientReactiveClientCredentialsTokenResponseClient
不提供此功能,因此我们必须实现自己的功能(我们可以使用现有的WebClientReactiveClientCredentialsTokenResponseClient
逻辑)。我的实现名为
UaaWebClientReactiveClientCredentialsTokenResponseClient
(省略了实现,因为它只对headers()
和body()
方法从默认的WebClientReactiveClientCredentialsTokenResponseClient
进行了非常细微的修改,以添加一些额外的头/主体字段,它并没有改变底层的身份验证流)。设定
WebClient
ServerOAuth2AuthorizedClientExchangeFilterFunction.setClientCredentialsTokenResponseClient()
方法已过时,因此请遵循该方法的过时建议:已弃用。* 请改用
ServerOAuth2AuthorizedClientExchangeFilterFunction(ReactiveOAuth2AuthorizedClientManager)
。创建一个使用WebClientReactiveClientCredentialsTokenResponseClient
(或自定义)配置的ClientCredentialsReactiveOAuth2AuthorizedClientProvider
的示例,然后将其提供给DefaultReactiveOAuth2AuthorizedClientManager
。*最后的配置如下所示:
正常使用
WebClient
oAuth2WebClient
bean现在可以用来访问由我们配置的OAuth2提供程序保护的资源,就像您使用WebClient
发出任何其他请求一样。lbsnaicq5#
这是
OAuth2RestTemplate
的一个简单的替代方案。下面的代码片段已经使用Sping Boot3.0.0-M4
进行了测试,并且不需要application.yml
配置。SecurityConfig.java
pom.xml