Безопасность работает корректно в модульном тестировании, но не при развертывании на сервере приложений (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;
}
}

0 ответов

Другие вопросы по тегам