Это может звучать немного странно.Но у меня есть ситуация, когда моему приложению нужно сделать запрос токена ROPC с userdetails, который нужно взять из свойств.
Вызов инициируется, когда есть случайный входящий запрос, который является анонимным.Но в запросе токена при достижении AccessTokenProviderChain.class
запрос токена завершается неудачно.
org.springframework.security.authentication.InsufficientAuthenticationException: требуется аутентификация для получения токена доступа (анонимный доступ запрещен)
При отладке я обнаружил, что это происходит вниже линии.
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth instanceof AnonymousAuthenticationToken && !resource.isClientOnly()) {
throw new InsufficientAuthenticationException("Authentication is required to obtain an access token (anonymous not allowed)");
}
Я вижу, что AnonymousAuthenticationFilter
устанавливает принципал как anonymousUser
- Это потому, что входящий запрос является анонимным, и я пытаюсь сделать запрос токена ROPC?
- Это потому, что я включил
@EnableMongoAuditing
.
Есть ли способ исправить эту проблему, кроме создания пользовательского запроса токена.
Код:
public OAuth2RestTemplate myappROPCRestTemplate() {
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(myappPasswordResourceDetails());
restTemplate.setAccessTokenProvider(getAccessTokenProvider());
if (proxyEnabled) {
restTemplate.setRequestFactory(getRequestFactoryWithProxy());
}
return restTemplate;
}
private AccessTokenProvider getAccessTokenProvider() {
ResourceOwnerPasswordAccessTokenProvider resourceOwnerPasswordAccessTokenProvider = new ResourceOwnerPasswordAccessTokenProvider();
if (proxyEnabled) {
resourceOwnerPasswordAccessTokenProvider.setRequestFactory(getRequestFactoryWithProxy());
}
return new AccessTokenProviderChain(Collections.singletonList(resourceOwnerPasswordAccessTokenProvider));
}
private SimpleClientHttpRequestFactory getRequestFactoryWithProxy() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setOutputStreaming(false);
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
requestFactory.setProxy(proxy);
return requestFactory;
}
private OAuth2ProtectedResourceDetails myappPasswordResourceDetails() {
ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
resource.setAccessTokenUri(tokenUrl);
resource.setClientId(clientId);
resource.setClientSecret(clientSecret);
resource.setUsername(username);
resource.setPassword(password);
resource.setClientAuthenticationScheme(AuthenticationScheme.form);
resource.setGrantType("password");
return resource;
}