Безопасность работает корректно в модульном тестировании, но не при развертывании на сервере приложений (weblogic)
Кто-нибудь может сказать, почему это не сработало? Код прекрасно работает, когда я запускаю его из своих модульных тестов. Безопасность настроена отлично, и наш сервис работает отлично, как я и ожидал.
Однако, когда я развернул его на нашем сервере приложений (weblogic), мой сервис каждый раз отказывает, потому что мои токены не получают настройку. Я получил его, установив токены каждый раз, когда мой send(final ServiceAPInvoice invoice)
метод вызывается.
Мой вопрос: почему токены не настраиваются моим конструктором, когда они развернуты в нашей среде Weblogic? Что вызывает эту проблему? OAuthSecurityContextHolder является статическим классом. Это играет в мою проблему? Буду ли я по-прежнему сталкиваться с проблемами, если буду устанавливать токены при каждом вызове моего метода send? Я не заметил никаких проблем, но не провел нагрузочного тестирования.
Я использую Spring OAuthRestTemplate (1.0), и у меня есть токены с истекающим сроком действия, которые мне нужно настроить.
Здесь происходит волшебство. Мне пришлось немного переименовать код, чтобы сделать его универсальным, так что, надеюсь, у меня нет опечаток:
public class ServiceRestTemplate {
private final OAuthRestTemplate serviceOAuthRestTemplate;
private final String apUri;
private final String arUri;
private final String tokenValue;
private final String tokenSecret;
public ServiceRestTemplate(final OAuthRestTemplate serviceOAuthRestTemplate,
final String apUri,
final String arUri,
final String tokenValue,
final String tokenSecret) {
this.serviceOAuthRestTemplate = serviceOAuthRestTemplate;
this.apUri = apUri;
this.arUri = arUri;
this.tokenSecret = tokenSecret;
this.tokenValue = tokenValue;
setContext(tokenValue, tokenSecret); // I expected this to be enough to setup my tokens 1 time
}
private void setContext(final String tokenValue, final String tokenSecret) {
final OAuthConsumerToken accessToken = new OAuthConsumerToken();
accessToken.setAccessToken(true);
accessToken.setResourceId(serviceOAuthRestTemplate.getResource().getId());
accessToken.setValue(tokenValue);
accessToken.setSecret(tokenSecret);
final OAuthSecurityContextImpl securityContext = new OAuthSecurityContextImpl();
if (securityContext.getAccessTokens() == null) {
securityContext.setAccessTokens(new HashMap<String, OAuthConsumerToken>());
}
if (!securityContext.getAccessTokens().containsKey(accessToken.getResourceId())) {
securityContext.getAccessTokens().put(accessToken.getResourceId(), accessToken);
}
OAuthSecurityContextHolder.setContext(securityContext);
}
@Override
public ServiceWebResponse send(final ServiceAPInvoice invoice) {
setContext(this.tokenValue, this.tokenSecret); // This line of code is the workaround to fixed my issue.
final ServiceWebResponse serviceResponse = serviceOAuthRestTemplate.postForObject(apUri,
invoice,
ServiceWebResponse.class);
return serviceResponse;
}
}