gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:35 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com