首页 > 解决方案 > java Authenticator 类不在 POST 上进行身份验证

问题描述

我正在创建一个 Spring Boot REST 完整服务来向 CRM Dynamics 发送 GET 和 POST 请求。

CRM Dynamics 使用 OData REST Web 服务和 NTLM 身份验证。

就我而言,我在这段代码中使用Authenticator.setDefault(authenticator)进行身份验证(DAO 构造函数)

public CRMIntegrationDAO() {
    NtlmAuthenticator authenticator = new NtlmAuthenticator(CRMProps.getLogin(), CRMProps.getPassword());
    Authenticator.setDefault(authenticator);
}

但奇怪的是,这个类没有在 POST 请求上验证我的应用程序。如果我首先发出 GET 请求,它可以正常工作,其他 GET 和 POST 也可以。但是,如果我想先发布 POST,我会收到401:未经授权。

在日志中,我可以看到在 GET 请求中,我的应用程序调用 CRM Dynamics 两到三次以获得授权。但是在 POST 上它只创建一个请求。

该类是否有任何解决方法或任何其他用于 Java/Spring Boot 中 NTLM 身份验证的解决方案(除了在 POST 之前调用 GET)。

PS CRM Dynamics 管理员说 Dynamics 端没有 API 会话设置。

先感谢您。

DAO 类中 POST 请求的 PS 代码

public ResponseEntity<String> processPOSTNewTask(String body) {
    log.debug(String.format("DAO received parameters: %s", body));

    String url = CRMProps.getUrl() + CRMProps.getTaskEntity();
    try {
        return processPOST(url, body);
    } catch (Exception e) {
        return GlobalUtils.buildErrorResponseEntity(Utils.MODULE_NAME, e.getMessage());
    }
}

private ResponseEntity<String> processPOST(String url, String body) {
    RestTemplate restTemplate = new RestTemplate();

    HttpEntity<String> entity = new HttpEntity(body, setHeaders());

    log.debug("headers " + entity.getHeaders());

    ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);

    return response;
}

标签: javaspring-bootauthenticationodatadynamics-crm

解决方案


推荐阅读