【问题标题】:Kerberos client - kerberoRestTemplate not workingKerberos 客户端 - kerberoRestTemplate 不工作
【发布时间】:2021-03-08 11:03:33
【问题描述】:

我正在尝试使用一个通过 Kerberos 进行身份验证的 api。我已经参考了以下与 KerberosRestTemplate.reference link 相关的 spring 文档,我传递了正确的 keytab 文件和参考文档中提到的 userPrincipal 值。但我仍然从服务器收到 401。 但是当我在终端中执行 kinit 命令时,它会收到来自 KDC 的票证,然后我就可以执行 curl 命令并获得有效的响应。

        KerberosRestTemplate kerberosRestTemplate = new KerberosRestTemplate("svc_dfsd.keytab", "svc_dfsd@sswe.AD");
        String url="https://wexample.com:20550/aggr_subscriber_summary_hbase/03434809824";
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Arrays.asList(MediaType.TEXT_XML));
        HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

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

您能否建议任何其他更好的方法来执行此操作或解决此问题。非常感谢您的所有 cmets!!!

【问题讨论】:

    标签: spring-boot spring-security kerberos resttemplate spring-security-kerberos


    【解决方案1】:

    对 Kerberos 进行故障排除可能会很棘手,因为错误通常具有误导性,并且如果隐式操作(URL 的规范化等),Java 实现会做很多事情。

    我建议尝试 Kerb4J 库,它允许您显式生成 kerberos 令牌:

    SpnegoClient spnegoClient = SpnegoClient.loginWithKeyTab("svc_dfsd@sswe.AD", "svc_dfsd.keytab");
    SpnegoContext context = spnegoClient.createContext("https://wexample.com"); // Will result in HTTP/wexample.com SPN
    
    RestTemplate restTemplate = new RestTemplate();
    String url="https://wexample.com:20550/aggr_subscriber_summary_hbase/03434809824";
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.TEXT_XML));
    headers.add("Authorization", context.createTokenAsAuthroizationHeader());
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
    
    ResponseEntity<String> response = restTemplate .exchange(url, HttpMethod.GET, entity, String.class);
    

    如果默认 SPN 分辨率适合您,您还可以使用来自此 Kerb4J 的 SpnegoRestTemplate

    SpnegoClient spnegoClient = SpnegoClient.loginWithKeyTab("svc_dfsd@sswe.AD", "svc_dfsd.keytab");
    
    SpnegoRestTemplate spnegoRestTemplate = new SpnegoRestTemplate(spnegoClient);
    String url="https://wexample.com:20550/aggr_subscriber_summary_hbase/03434809824";
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.TEXT_XML));
    HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
    
    ResponseEntity<String> response = spnegoRestTemplate.exchange(url, HttpMethod.GET, entity, String.class);
    

    免责声明:我是 Kerb4J 的作者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2017-03-26
      相关资源
      最近更新 更多