我正在研究Baeldung的Spring安全性和OAuth2实现。我正在运行Spring Security登录和注册项目,希望将其扩展为访问OAuth2保护的资源。该应用程序已在我的身份验证服务器上注册,但是我无法获得访问令牌。我的第二个问题涉及用户数据库在现实生活中通常存储在哪里。在Baeldung的项目中,它是在客户端应用程序中设置的,因此用户可以进行身份验证,但是授权服务器无权对其进行访问。我可以让授权服务器共享相同的数据库,但是我看不到这是现实情况,开发人员与创建授权和资源服务器的组织分开创建客户端应用程序。任何对此的澄清将是有帮助的。
公共类AuthorizationHeaderInterceptor实现ClientHttpRequestInterceptor {
private OAuth2AuthorizedClientService clientService;
public AuthorizationHeaderInterceptor(OAuth2AuthorizedClientService clientService) {
this.clientService = clientService;
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String accessToken = null;
OAuth2AuthenticationToken auth = (OAuth2AuthenticationToken) authentication;
if (authentication != null && authentication.getClass().isAssignableFrom(OAuth2AuthenticationToken.class)) {
//OAuth2AuthenticationToken auth = (OAuth2AuthenticationToken) authentication;
String clientRegistrationId = auth.getAuthorizedClientRegistrationId();
OAuth2AuthorizedClient client = clientService.loadAuthorizedClient(clientRegistrationId, auth.getName());
accessToken = client.getAccessToken().getTokenValue();
request.getHeaders().add("Authorization", "Bearer " + accessToken);
}
return execution.execute(request, bytes);
}
}
这时,我可以注册/登录客户端应用程序。一旦通过身份验证,用户将被发送到网页,该网页对后端进行剩余调用,并执行列出的代码。由于授权服务器不了解客户端数据库,因此我期望收到错误的凭据答复(这就是为什么我要求对实际用例进行说明)。但是,我收到此错误,却没有找到解决方法。
org.springframework.security.authentication.UsernamePasswordAuthenticationToken无法转换为org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken