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

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