我有一个自动连接许多服务的控制器。这些服务是 HTTP Restful 调用,从各种数据源检索数据,但这些服务受 OAuth2.0 保护。
我正在尝试使用 Spring Security 来实现客户端凭据流,该流将允许这些服务安全地从这些受保护的数据源检索数据,但在解析服务层的 OAuth2AuthorizedClient 数据对象时遇到一些困难。
我一直在尝试通过以下方式解决授权客户的问题@RegisteredOAuth2AuthorizedClient https://docs.spring.io/spring-security/site/docs/current/reference/html5/#webflux-roac注解:
public void setAuthorizedClient(
@RegisteredOAuth2AuthorizedClient("azure") OAuth2AuthorizedClient authorizedClient) {
ClientRegistration clientRegistration =
this.clientRegistrationRepository.findByRegistrationId("azure");
System.out.println(clientRegistration);
OAuth2AccessToken accessToken = authorizedClient.getAccessToken();
jwtToken = accessToken.getTokenValue();
}
是否可以解决OAuth2授权客户端 https://docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2Client-authorized-client作为一个 Spring bean,然后可以注入到另一个 bean 中?
或者有更好的方法来构建这样的系统吗?
Thanks!
这是一个老问题,但我刚刚为自己解决了这个问题,所以这里是:
您可以创建一个为您返回 OAuth2AuthorizedClient 的 @Component,并将其注入到您需要的地方。这是一个示例方法:
- 创建一个提供者组件类
- 将现成的 OAuth2AuthorizedClientService bean 注入到您的类中
- 创建一个使用该服务的方法以返回 OAuth2AuthorizedClient
- 将您的提供者类注入到您的控制器中
Example:
@Component
public class OAuth2AuthorizedClientProvider {
@Autowired
private OAuth2AuthorizedClientService clientService;
public OAuth2AuthorizedClient getClient() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
return clientService.loadAuthorizedClient(oauthToken.getAuthorizedClientRegistrationId(), oauthToken.getName());
}
然后在控制器中使用 OAuth2AuthorizedClientProvider,如下所示:
@RestController
public class Endpoint {
@Autowired
private final OAuth2AuthorizedClientProvider oauth2AuthorizedClientProvider;
@GetMapping("/mymethod")
public String mymethod() {
return oauth2AuthorizedClientProvider.getClient().getAccessToken();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)