Spring Security Kerberos 配置IWA的关键步骤备忘

IWA: integrated windows authentication
简介:Windows域环境下,终端用户在使用电脑windows系统时已经通过域账户登录了,在使用一些application的时候,也想通过这种方式做认证,不需要在每个application再输入用户名密码。

Kerberos的认证原理貌似比较复杂,我也没看太懂,反正刚开始先用别人的封装把环境搭起来,这里使用了Spring Security Kerberos(以下简称SSK):
http://docs.spring.io/spring-security-kerberos/docs/1.0.1.RELEASE/reference/htmlsingle/

文档比较详细了,主要提供以下功能:
1. Authentication Provider
2. Spnego Negotiate
3. Using KerberosRestTemplate
4. Authentication with LDAP Services

在项目中使用了功能2,用户在访问我们登陆页面时,由SSK提供的Filter:SpnegoAuthenticationProcessingFilter负责检查用户Http Request中的Authorization Header,如果认证失败,会在entryPoint(SpnegoEntryPoint)的commence方法中执行以下代码,浏览器获取这个response后会自动发送kerberos ticket给当前url(这里流程可能不太严谨,没细看过negotiate的整个过程)
response.addHeader("WWW-Authenticate", "Negotiate");
response.setStatus(401);


回到Filter,如果浏览器发来了kerberos ticket,就会有如下的逻辑去检查这个ticket:
if ((header != null) && ((header.startsWith("Negotiate ")) || (header.startsWith("Kerberos ")))) 


然后调用KerberosServiceAuthenticationProvider进而调用SunJaasKerberosTicketValidator校验kerberos ticket。从类名上来看还是依赖了底层java自己对kerberos的支持,用JaaS做的。

校验成功后就可以拿到SSK帮我们封装好的Authentication对象,里面包含了user的principal.用户的其他属性我不知道在kerberos里面怎么获取,在我们的项目是要用户另外配置AD的连接信息然后我们主动去取的,不知道其他项目是如何解决的。

搭建过程中比较麻烦的就是windows domain controller(我的这个domain controller和KDC kerberos distribution center是同一台机器)的安装还有keytab文件的生成。不过windows server2012搞domain还是比较简单的,基本无脑的下一步就可以了。

keytab文件是在domain controller这台服务器上生成的,然后拷贝到application所在的server,通过SSK指定keytab文件所在位置和服务名称。生成命令如下:


domain controller上运行的两个命令如下(每次看CLI里面的参数就蛋裂,打码写了一下我用的命令):
setspn -A HTTP/url.[domainName] [username]

setspn -A HTTP/host1.domain.com tomcat1

ktpass -out c:\tomcat1.keytab -mapuser [username]@[domainName] -princ HTTP/url.idm-domain.com@[domainName] -pass [password] -ptype KRB5_NT_PRINCIPAL -crypto All

ktpass -out c:\tomcat1.keytab -mapuser [email protected] -princ HTTP/[email protected] -pass 1234 -ptype KRB5_NT_PRINCIPAL -crypto All

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章