You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Spring Security搭配Kerberos时跨应用SSO不生效?

问题核心原因

  • 你使用的Spring Security Kerberos示例默认是 SPNEGO协商优先、表单认证兜底 的逻辑:你首次访问subdomain1时,Windows本地没有对应Kerberos域的TGT(票据授予票据),SPNEGO自动协商失败,触发了表单登录。此时你拿到的是subdomain1应用独立的Session Cookie,仅在当前域名下生效,无法被subdomain2识别,因此访问第二个应用时会再次触发认证流程。
  • 你自定义了KDC端口为12345,但未在Windows端配置Kerberos参数指定该端口:Windows默认向KDC的88端口发起请求,无法正常连接你部署的KDC服务,导致SPNEGO协商全程失效,所有应用访问都会落到表单认证逻辑,无法实现Kerberos层面的单点登录。

其他可能的触发原因

  • Windows端未将MYDOMAIN.LOCAL加入信任Kerberos域列表,导致浏览器不会自动向该域下的服务发起SPNEGO协商请求。
  • 你使用的两个服务主体对应的keytab文件生成时参数错误,导致服务端无法正常解析Kerberos票据,协商失败触发表单兜底。
  • Windows端Kerberos缓存存在异常,无法正常申请第二个服务的ST(服务票据)。

修复方案

  1. 先配置Windows端Kerberos参数:修改C:\Windows\krb5.ini(不存在则新建),添加以下配置,指定自定义KDC端口:
[libdefaults]
default_realm = MYDOMAIN.LOCAL
dns_lookup_kdc = false
dns_lookup_realm = false

[realms]
MYDOMAIN.LOCAL = {
    kdc = <你的Linux服务器IP>:12345
    admin_server = <你的Linux服务器IP>:12345
    default_domain = MYDOMAIN.LOCAL
}

[domain_realm]
.mydomain.local = MYDOMAIN.LOCAL
mydomain.local = MYDOMAIN.LOCAL
  1. 在Windows端手动执行kinit user1@MYDOMAIN.LOCAL,输入密码后获取全局TGT,执行klist确认TGT已缓存。
  2. 重启Firefox浏览器,再次访问两个应用,此时会自动走SPNEGO协商,无需重复输入密码。
  3. 若仍触发表单认证,可开启Spring Security Kerberos的调试日志,排查服务端票据解析失败的具体原因。

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:27:05