領先一步
VMware 提供訓練和認證,以加速您的進展。
瞭解更多我們很高興地宣布 Spring Security Kerberos 擴充套件的第一個里程碑版本現已開放下載。此版本也可透過 Maven 里程碑儲存庫取得,網址為http://maven.springframework.org/milestone。透過 Spring Security Kerberos 擴充套件,您的使用者只需開啟 URL 即可針對您的 Web 應用程式進行身分驗證。無需輸入使用者名稱/密碼,也無需安裝額外的軟體。
在深入探討 Kerberos 之前,我想先介紹 Spring Security Extensions,這是一個新的 Spring Extension 專案,致力於為核心 Spring Security 專案提供擴充模組。目前我們已在此開發了兩個擴充套件:SAML2 整合和 Kerberos/SPNEGO 整合。每個模組都會有自己的發佈週期,以便人們可以在這些擴充套件準備就緒時立即受益,而無需等待下一個 Spring Security 版本。如果您對進一步的擴充有任何想法,甚至有一些程式碼,請告訴我們!
瀏覽器向您的 Web 應用程式傳送 GET 請求 (1),然後 Web 應用程式會傳回需要 "negotiate" 身分驗證 (2)。然後,瀏覽器會要求 Kerberos 伺服器取得所謂的服務票證 (3)。接著,瀏覽器會將此服務票證(證明呼叫者的身分)和一些額外資訊傳送至 Web 應用程式 (5)。在根據您的 Web 應用程式與 Kerberos 伺服器之間的一些共用密碼驗證票證後,您會取回使用者名稱。
為了使此功能運作,每個 Web 應用程式都需要在 Kerberos 伺服器上註冊,並取得服務主體和指派的共用密碼。對於 Web 應用程式,服務主體必須是 "HTTP/<完整合格網域名稱>@網域"。例如 "HTTP/web.[email protected]",如果您的應用程式在 web.springsource.com 上執行。然後,您需要將此主體的憑證匯出到 keytab 檔案(共用密碼),並使其可供您的應用程式使用。每個基於 Kerberos 的系統都會以這種方式運作,但服務主體和 keytab 的建立在不同系統之間有所不同。我將向您展示如何在 Microsoft Windows 和 MIT Kerberos 中執行此操作,但它也應該適用於其他實作。
建立一個將成為服務主體的普通使用者。使用者名稱和密碼對於 Kerberos 來說沒有意義,但您當然應該選擇一個有用的名稱,例如 http-web.springsource.com。只需確保您停用「使用者必須在下次登入時變更密碼」選項,並啟用「密碼永不過期」。
在那之後,您必須使用命令列工具 "ktpass.exe"。它已包含在 Windows 2008 Server 中,在較早的版本中,您必須自行安裝。只需確保您使用的版本與您的伺服器版本相符,並且地區設定也應相符。此工具會將服務主體名稱 (SPN) 指派給您先前建立的使用者,並將使用者金鑰匯出到 keytab 檔案。如果您的服務主體是 "HTTP/web.[email protected]",而您的使用者是 http-web.springsource.com,則您的 ktpass 命令應如下所示
ktpass /out http-web.keytab /mapuser [email protected] /princ HTTP/[email protected] /pass *
ktpass 會提示您輸入一些密碼。您應該為其選擇一些安全的隨機密碼。如果您現在在目錄中擁有檔案 http-web.keytab,則一切運作正常。稍後在您的應用程式中需要此檔案,因為它包含驗證服務票證的共用密碼。
kadmin: addprinc -randkey HTTP/web.springsource.com
kadmin: ktadd -k /http-web.keytab HTTP/web.springsource.com
然後您應該在 root 下擁有一個檔案 http-web.keytab。稍後在您的應用程式中需要此檔案,因為它包含驗證服務票證的共用密碼。
為了在 Spring Security 中使用 Kerberos 模組,您只需宣告一個篩選器、一個身分驗證進入點和一個身分驗證提供者。我們包含了一個範例 Web 應用程式,您可以將其用作起點。您只需設定您的服務主體名稱,並將您產生的 keytab 放在那裡。範例應用程式包含在上面提到的下載中。
如果您開啟範例應用程式的 security.xml 檔案,該檔案位於 /src/main/webapp/WEB-INF 下,您會看到一個使用新 Kerberos 模組的基本 Spring Security 設定。
<sec:http entry-point-ref="spnegoEntryPoint">
<sec:intercept-url pattern="/secure/**" access="IS_AUTHENTICATED_FULLY" />
<sec:custom-filter ref="spnegoAuthenticationProcessingFilter" position="BASIC_PROCESSING_FILTER" />
</sec:http>
<bean id="spnegoEntryPoint" class="org.springframework.security.extensions.kerberos.web.SpnegoEntryPoint" />
<bean id="spnegoAuthenticationProcessingFilter" class="org.springframework.security.extensions.kerberos.web.SpnegoAuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider ref="kerberosServiceAuthenticationProvider" />
</sec:authentication-manager>
<bean id="kerberosServiceAuthenticationProvider" class="org.springframework.security.extensions.kerberos.KerberosServiceAuthenticationProvider">
<property name="ticketValidator">
<bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator">
<property name="servicePrincipal" value="HTTP/web.springsource.com" />
<property name="keyTabLocation" value="classpath:http-web.keytab" />
</bean>
</property>
<property name="userDetailsService" ref="dummyUserDetailsService" />
</bean>
<!-- Just returns the User authenticated by Kerberos and gives him the ROLE_USER -->
<bean id="dummyUserDetailsService" class="org.springframework.security.extensions.kerberos.sample.DummyUserDetailsService"/>
前兩個 bean(SpnegoEntryPoint 和 SpnegoAuthenticationProcessingFilter)負責交握,而 KerberosServiceAuthenticationProvider 則最終驗證服務票證。目前我們僅支援 SUN 的 JRE/JDK 中包含的 Kerberos/SPNEGO 實作。由於您僅從 Kerberos 取回使用者名稱,因此您還需要 UserDetailsService 來擷取角色,以及可能其他使用者屬性。在此範例中,我們僅使用虛擬實作來簡化測試。
如您所見,我們已經填寫了服務主體名稱和 keytab 位置。根據您的需要變更這些值,並確保先前產生的 keytab 可在此位置取得。
現在啟動您的伺服器,並嘗試 SPNEGO 身分驗證。您應該會在瀏覽器中看到您的完整網域使用者名稱。在您的程式碼中,您可以使用正常的 Spring Security 類別,甚至使用標準 Java servlet 呼叫 request.getRemoteUser() 擷取使用者名稱。如果它不起作用(也許您看到一個空白頁面),請檢查以下事項
除此之外,設定正確的 Kerberos 環境可能很複雜,並且在您開始使用 Spring Security Kerberos 擴充套件之前,正確設定它非常重要。我們在諮詢期間遇到的大多數問題都是 Kerberos 環境的問題,而不是應用程式本身的問題。
如果您想在自己的 Maven 專案中使用 Spring Security Kerberos 擴充套件,則必須將 Spring Milestone Repository 新增至您的 pom.xml。它應該看起來像這樣
<repositories>
<repository>
<id>spring-milestone</id>
<name>Spring Portfolio Milestone Repository</name>
<url>http://maven.springframework.org/milestone </url>
</repository>
</repositories>
當然還有依賴項
<dependency>
<groupId>org.springframework.security.extensions</groupId>
<artifactId>spring-security-kerberos-core</artifactId>
<version>1.0.0.M1</version>
</dependency>
還有一些工作要做,例如也為 Java 用戶端提供 Kerberos,而不僅僅是伺服器,但我們希望您會嘗試這個里程碑版本並提供一些回饋。社群論壇是提出問題或開始討論新功能的最佳場所。或者,如果您發現任何錯誤,您可以提出 Jira Issue。