領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多我們很高興地宣佈,Spring Security Kerberos 擴充套件的第一個里程碑版本現已開放下載。該版本也可透過 Maven 里程碑倉庫獲取,地址為:http://maven.springframework.org/milestone。藉助 Spring Security Kerberos 擴充套件,您的使用者只需開啟 URL 即可對您的 Web 應用程式進行身份驗證。無需輸入使用者名稱/密碼,也無需安裝額外的軟體。
在深入探討 Kerberos 之前,我想先介紹一下 Spring Security 擴充套件,這是一個新的 Spring 擴充套件專案,致力於為核心 Spring Security 專案提供擴充套件模組。目前我們開發了兩個擴充套件:一個 SAML2 整合和一個 Kerberos/SPNEGO 整合。每個模組都有自己的釋出週期,因此人們可以儘快從這些擴充套件中受益,而不必等待下一個 Spring Security 版本釋出。如果您有任何想法,甚至有一些用於進一步擴充套件的程式碼,請告訴我們!

瀏覽器向您的 Web 應用程式傳送 GET 請求 (1),然後 Web 應用程式返回需要“協商”身份驗證 (2)。然後瀏覽器會要求 Kerberos 伺服器獲取所謂的服務票據 (3)。然後瀏覽器會將此服務票據(證明呼叫者的身份)和一些額外資訊傳送到 Web 應用程式 (5)。在根據您的 Web 應用程式和 Kerberos 伺服器之間的共享金鑰驗證票據後,您將獲得使用者名稱。
為此,每個 Web 應用程式都需要在 Kerberos 伺服器註冊,並獲得一個服務主體和一個共享金鑰。對於 Web 應用程式,服務主體必須是 "HTTP/<完全限定域名>@DOMAIN"。例如,如果您的應用程式執行在 web.springsource.com 上,則為 "HTTP/web.[email protected]"。然後,您需要將此主體的憑據匯出到金鑰表文件(共享金鑰),並將其提供給您的應用程式。每個基於 Kerberos 的系統都將以這種方式工作,但建立此服務主體和金鑰表在不同系統之間有所不同。我將向您展示如何使用 Microsoft Windows 和 MIT Kerberos 來完成此操作,但它也應該適用於其他實現。
建立一個普通使用者,該使用者將成為服務主體。使用者名稱和密碼對於 Kerberos 來說沒有意義,但您當然應該選擇一個有用的名稱,例如 http-web.springsource.com。只需確保您取消啟用選項“使用者必須在下次登入時更改密碼”並激活“密碼永不失效”。
之後,您必須使用命令列工具 "ktpass.exe"。它已經包含在 Windows 2008 Server 中,在早期版本中您必須自行安裝。只需確保您使用的版本與您的伺服器版本匹配,並且區域設定也應該匹配。此工具會將服務主體名稱 (SPN) 分配給您之前建立的使用者,並將使用者金鑰匯出到金鑰表文件。如果您的服務主體是 "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 應用程式,您可以將其用作起點。您只需配置您的服務主體名稱並將您生成的金鑰表放在那裡。示例應用程式包含在上面提到的下載中。
如果您開啟示例應用程式的 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 來獲取角色和可能的一些其他使用者屬性。在此示例中,我們只使用一個虛擬實現來簡化測試。
如您所見,我們已經填寫了服務主體名稱和金鑰表位置。根據您的需要更改這些值,並確保之前生成的金鑰表在此位置可用。
現在啟動您的伺服器並嘗試進行 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 問題。