sna*_*ark 5 kerberos spring-rest livy
我在https://github.com/apache/incubator-livy/blob/master/docs/rest-api.md 上为 Livy 的 REST API 的部分编写了一个 Java 客户端。客户端使用 Spring 的RestTemplate.getForObject()andpostForObject()分别发出 GET 和 POST 请求。Livy 服务器使用 Kerberos 进行保护。
GET /sessions和GET /batches请求工作正常:我得到了 Livy 的预期响应。但是POST /sessions和POST /batches请求都失败了:
org.springframework.web.client.HttpClientErrorException: 401 Authentication required
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么 GET 请求成功时 POST 请求失败?我的代码对身份验证没有做任何明确的事情。
我已经尝试通过 Kerberos 以几个不同的用户身份进行身份验证,但我总是遇到这个问题。Livy 是否需要额外的配置来允许来自特定用户的 POST 请求(因为 POST 请求有效地创建了交互式会话或将作业提交给 Spark)?
事实证明,虽然常规org.springframework.web.client.RestTemplate类足以用于 GET 请求,但您需要org.springframework.security.kerberos.client.KerberosRestTemplate用于 POST 请求。如果 Livy 服务器按此处所述启用了 CSRF(跨站点请求伪造)保护,您可能还需要向 POST 请求添加额外的标头。
GET /batches 示例
RestTemplate restTemplate = new RestTemplate();
GetBatchesResponse response2 = restTemplate.getForObject("http://your_livy_server:8998" + "/batches", GetBatchesResponse.class);
Run Code Online (Sandbox Code Playgroud)
这里GetBatchesResponse是一个简单的POJO我已经写了代表响应体来GET /batches。
POST /batches 示例
PostBatchesRequest postRequestBody = new PostBatchesRequest();
postRequestBody.setFile("/path/to/your/application"); // In HDFS
KerberosRestTemplate kerberosRestTemplate = new KerberosRestTemplate("path_to_your_key_tab_file", "your_user@your_realm");
// Add CSRF header if required:
HttpHeaders headers = new HttpHeaders();
headers.set("X-Requested-By", "your_user@your_realm");
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<PostBatchesRequest> postRequest = new HttpEntity<PostBatchesRequest>(postRequestBody, headers);
Batch batch = kerberosRestTemplate.postForObject("http://your_livy_server:8998" + "/batches", postRequest, Batch.class);
Run Code Online (Sandbox Code Playgroud)
其中PostBatchesRequest和Batch是我编写的分别代表请求正文和响应的POJO 。
| 归档时间: |
|
| 查看次数: |
1650 次 |
| 最近记录: |