我是Kerberos的新手,但我需要为Web应用程序提供SSO Kerberos身份验证。 我的应用程序的流程如下所示:
1)用户在网址上进行GET
2)如果没有授权,则检查是否有401 WWW-Authenticate:Negotiate
3)使用标题我创建KerberosServiceRequestToken
4)使用SpringSecurity KerberosServiceAuthenticationProvider它尝试验证但我总是得到异常:
org.springframework.security.authentication.BadCredentialsException: GSSContext name of the context initiator is null
SpringSecurity中的配置:
public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() {
KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider();
provider.setTicketValidator(sunJaasKerberosTicketValidator());
return provider;
}
public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() {
SunJaasKerberosTicketValidator validator = new SunJaasKerberosTicketValidator();
validator.setServicePrincipal("HTTP/principal");
validator.setKeyTabLocation(new ClassPathResource("kerberos/http-web.keytab"));
validator.setDebug(true);
return validator;
}
}
答案 0 :(得分:0)
将keytab位置更改为基于文件的位置,并将其从类路径中删除。
以下是一个示例:
validator.setKeyTabLocation(new FileSystemResource("kerberos/http-web.keytab"));
P.S。不要忘记在UserDetailService
中设置KerberosServiceAuthenticationProvider
。
如果这不能解决问题,请检查您的应用程序是否获得了正确的SPNEGO令牌。除非所有其他设置都已到位,否则您可能无法获得正确的令牌。