为什么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(服务票据)。
修复方案
- 先配置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
- 在Windows端手动执行
kinit user1@MYDOMAIN.LOCAL,输入密码后获取全局TGT,执行klist确认TGT已缓存。 - 重启Firefox浏览器,再次访问两个应用,此时会自动走SPNEGO协商,无需重复输入密码。
- 若仍触发表单认证,可开启Spring Security Kerberos的调试日志,排查服务端票据解析失败的具体原因。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

