java - SPNEGO 身份验证失败的自定义错误页面

标签 java spring spring-mvc spring-security spring-boot

我有一个 Spring MVC REST 端点,我已成功将其配置为受 Kerberos 保护 as recommended 。身份验证成功后一切正常。问题在于自定义 401 错误页面。

我将其配置为(我是 spring-boot 1.3.5)如下:

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
    return container -> container.addErrorPages(new ErrorPage(HttpStatus.UNAUTHORIZED, "/error/401.html"));
}

这很好用,我可以通过切换到例如来确认这一点。基本身份验证并提供错误的凭据。

当回到 Kerberos 时 - 如果我使用 kinit 访问我的安全端点,一切正常,并且在curl中我会看到详细的请求:

curl -v -u : --negotiate http://my-enpoint:8080/

> GET / HTTP/1.1
> Host: ...:8080
> User-Agent: curl/7.43.0
> Accept: */*

< HTTP/1.1 401 Unauthorized
< ...
< WWW-Authenticate: Negotiate

> GET / HTTP/1.1
> Host: ...:8080
> Authorization: Negotiate YIIH7 ...

< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< ...

现在,如果我kdestroy并再次进行 curl :

curl -v -u : --negotiate http://my-enpoint:8080/

> GET / HTTP/1.1
> Host:...8080
> User-Agent: curl/7.43.0
> Accept: */*

< HTTP/1.1 401 Unauthorized
< ...
< WWW-Authenticate: Negotiate

...就是这样。在这种情况下,spring 返回 401 作为预期响应,它是握手的一部分,因此不会发送错误页面。

这是我的两个问题:

  1. 当握手中途死亡时,如何返回 401 错误页面?

  2. 如果 spring 尝试协商但客户端根本没有响应,它怎么可能回退到任何其他身份验证作为回退(表单、基本)?

最佳答案

回到我的调查......

我观察到的这种行为是预期的。如果客户端(浏览器、curl)无法进行身份验证,则不会继续进行身份验证。提供自定义页面的关键是SpnegoEntrypoint。它允许在其中指定 forwardUrl 并且 javadoc 说:

Instantiates a new spnego entry point. This constructor enables security configuration to use SPNEGO in combination with login form as fallback for clients that do not support this kind of authentication.

重点是转发 URL 任何资源,它将包含在第一个 401 响应中。您可以包含任何页面,而不仅仅是表单登录。就我而言,我包含自定义 401 错误页面,因为我不执行任何身份验证回退。

@Bean
public SpnegoEntryPoint spnegoEntryPoint() {
    return new SpnegoEntryPoint("/error/401.html");
}

然后,通信看起来就像客户端发送 GET 并返回 401 响应,正文中包含我的自定义错误页面。如果客户端能够协商,它将完全忽略响应正文并使用适当的 token 重新提交请求。如果无法进行身份验证,它将显示返回的任何内容 - 自定义错误页面。

关于java - SPNEGO 身份验证失败的自定义错误页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39337436/

相关文章:

java - 如何在android后台服务中监听蓝牙套接字?

Java 8替代字符串中奇数位置的字符总和?

java - H2数据库中@GenerateValue的问题

java - Spring Boot 使用 JSON Sanitizer?

java - Spring MVC - 使用 java 执行 Oracle 存储过程?

java - 从 Spring MVC Controller 访问服务层

java - 如何将 Spring URL 映射到/WEB-INF/views 中的 JSP 文件?

java - JTable 中的行计数器

java - Spring MVC 请求映射传递不应该传递的请求

spring-mvc - 仅获取@Requestmapping 的通配符部分