Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法
LDAP身份驗證是全球范圍內最流行的企業應用程序身份驗證機制之一,而Active Directory (Microsoft針對Windows的LDAP實現)是另一種廣泛使用的LDAP服務器。 在許多項目中,我們需要通過登錄屏幕中提供的憑據使用LDAP對活動目錄進行身份驗證 。 有時,由于實現和集成過程中會遇到各種問題, 并且沒有進行LDAP身份驗證的標準方法,因此此簡單任務會變得棘手。 Java提供了LDAP支持,但是在本文中,我將主要討論spring安全性,因為它是我首選的Java框架,用于進行身份驗證,授權和安全性相關的工作。
我們可以通過編寫用于執行LDAP搜索然后進行LDAP綁定的自有程序來在Java中執行相同的操作,但是正如我所說的,當您使用Spring Security進行LDAP身份驗證時,它更容易,更簡潔。
除了LDAP支持外,Spring Security還提供了企業Java應用程序所需的其他一些功能,包括SSL安全性,密碼加密和會話超時功能。
1. LDAP認證基礎
在深入了解Active Directory上的LDAP身份驗證之前,讓我們熟悉一些LDAP術語,因為大多數時候用戶是第一次使用它,并且他們對典型的LDAP詞匯表(例如Dn,Ou,Bind或search等)不太熟悉。
Dn –專有名稱 ,唯一名稱,用于在LDAP服務器(例如Microsoft Active Directory)中查找用戶。
OU –組織單位 綁定– LDAP綁定是一種操作,其中LDAP客戶端將bindRequest發送給包括用戶名和密碼在內的LDAP用戶,如果LDAP服務器能夠正確找到用戶名和密碼,則它允許訪問LDAP服務器。 搜索– LDAP搜索是通過使用某些用戶憑證來檢索用戶的Dn的操作。 根 – LDAP目錄的頂部元素,例如樹的根。 BaseDn – LDAP樹中的一個分支,可用作LDAP搜索操作的基礎,例如dc = Microsoft,dc = org
如果您想了解有關LDAP的更多信息,請查看此鏈接,其中包含有關LDAP的詳細信息。
2. Active Directory Spring Security中的LDAP身份驗證
在Spring安全性中,有兩種方法可以使用LDAP協議來實現活動目錄身份驗證,第一種是編程和聲明性方法,需要一些編碼和一些配置。
另一方面,第二種方法是Spring Security提供的即用型解決方案,只需要配置ActireDirectoryAuthenticationProvider即可完成。 我們將看到兩種方法,但是我建議使用第二種方法,因為第二種方法簡單易用。
2.1在Spring Security中使用LDAP進行Active Directory身份驗證-示例1
組態
將以下配置添加到您的spring application-context.xml文件中,我建議將此配置與其他與安全相關的內容一起放在單獨的application-context-security.XML文件中。
1)配置LDAP服務器 為了配置LDAP服務器,請將以下XML代碼段放入Spring安全配置文件中:
此配置是不言自明的,但是有關管理器dn和密碼, 活動目錄或任何其他LDAP目錄上的LDAP身份驗證的簡短說明僅需兩步,首先需要執行LDAP搜索以找到用戶的Dn(專有名稱),然后進行LDAP搜索。然后此Dn用于執行LDAP綁定。
如果綁定成功,則用戶身份驗證成功,否則它將失敗。 有些人比LDAP綁定更喜歡密碼的遠程比較 ,但是LDAP綁定是您最不希望做的事情。
Active Directory的大部分內容都不允許匿名搜索操作,因此要執行LDAP搜索,您的服務必須具有LDAP帳戶,這是我們在此提供的manager-in和manager-password.property。
在Summary中 ,現在將通過以下步驟完成LDAP登錄:
到此完成了LDAP登錄部分。 現在,讓我們進入配置LDAP身份驗證提供程序的下一部分。
2)配置LDAP身份驗證提供程序
本節在spring-security中指定了各種身份驗證提供程序,在這里您可以看到LDAP身份驗證提供程序,并且我們使用userPrincipalName在Microsoft Active目錄中搜索用戶。
現在需要一小段編碼來傳遞userPrincipalName并驗證用戶。
public boolean login(String username, String password) {AndFilter filter = new AndFilter();ldapTemplate.setIgnorePartialResultException(true); // Active Directory doesn’t transparently handle referrals. This fixes that.filter.and(new EqualsFilter("userPrincipalName", username));return ldapTemplate.authenticate("dc=stockmarketindia,dc=trader", filter.toString(), password);}第2行在該程序中非常重要,因為我整日都在弄清楚應用程序何時反復拋出javax.naming.PartialResultException:未處理的連續引用,您也可以將sAMAccountName用于搜索用戶, userPrincipalName和sAMAccountName都是唯一的在Active Directory中。
這里最重要的是它必須是全名,例如name @ domain,例如jimmy@stockmarket.com。
authenticate()方法將根據綁定操作的結果返回true或false。
2.2在Spring Security中使用LDAP的Active Directory身份驗證-更簡單的示例
第二種方法更簡單,更清潔,因為它是開箱即用的,您只需要配置LDAP服務器URL和域名即可使用,就像奶油一樣。
<s:authentication-manager erase-credentials="true"><s:authentication-provider ref="ldapActiveDirectoryAuthProvider"/> </s:authentication-manager><bean id="ldapActiveDirectoryAuthProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider"><constructor-arg value="stockmarket.com" /> //your domain<constructor-arg value="ldap://stockmarket.com/" /> //ldap url </bean>就這樣,完成了。 此配置將對LDAP進行身份驗證并加載所有授予的權限 ,就像您所屬的組一樣。 這也與spring安全登錄元素集成在一起。
2.3依賴
這個示例基于spring security 3.0,我使用的是spring-ldap-1.3.1.RELEASE-all.jar和spring-security-ldap-3.1.0.RC3.jar。
如果您不知道如何下載Spring框架JAR文件,請按照此Spring Framework JAR下載指南中給出的步驟進行操作,該指南說明了如何從Maven Central下載Spring框架和其他相關JAR。
2.4 LDAP身份驗證期間的錯誤
您需要非常幸運地完成針對Active Directory的LDAP身份驗證而沒有任何錯誤或異常,在這里,我列出了我遇到的一些常見錯誤及其解決方案,以便快速參考。
1)javax.naming.PartialResultException:未處理的連續引用; 剩余名稱'dc = company,dc = com'
發生此錯誤是因為Microsoft Active Directory無法正確處理引用,并且要解決此問題,請設置此屬性
2)javax.naming.NameNotFoundException:[LDAP:錯誤代碼32 – No Such Object]; 剩余的名字”
該錯誤經過反復嘗試后得以解決,并且主要是由于用戶名格式無效造成的 。 它通過提供全名來解決,例如jemmy@stockmarket.com
2.5工具
LDAP瀏覽器 :最好使用一些工具來查看LDAP目錄中的數據,它可以為您提供一些可見性以及瀏覽LDAP中數據的方法。
它被稱為LDAP瀏覽器,網絡上有很多開源的LDAP瀏覽器,例如jexplorer。 您可以使用LDAP瀏覽器瀏覽和查看Active Directory中的數據。
2.6通過SSL的LDAP Active Directory身份驗證
這非常適合對Microsoft活動目錄實施LDAP身份驗證。 但是您可能要引起注意的一件事是,使用LDAP用戶名和密碼以明文形式傳輸到LDAP服務器,并且有權訪問LDAP流量的任何人都可以嗅探用戶憑據,因此并不安全。
一種解決方案是使用LDAP(基于SSL的LDAP)協議,該協議將加密LDAP客戶端和服務器之間的流量。
在spring-security中,這很容易做到,您需要更改的是URL而不是“ ldap://stockmarket.com/ ”,您需要使用“” ldaps://stockmarket.com/ 。 實際上, LDAP的端口是339 ,LDAPS 的端口 是636,但是第二種方法在Spring已得到注意,在第一種方法中,您需要提供此信息。
您可能會遇到的問題是“無法找到到所請求目標的有效認證路徑”
異常如下圖所示:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target此異常的原因很簡單, 在SSL握手期間返回的證書 不由在您的JRE密鑰中配置的任何受信任的證書頒發機構(CA) 簽名,例如Verisign,Thwate,GoDaddy或entrust等。相反,服務器發送的證書是JRE不知道。
要解決此問題,您需要將Server返回的證書添加到JRE的密鑰庫中。 順便說一句,如果您對密鑰庫和信任庫感到困惑,那么請閱讀我在Java中關于密鑰庫和信任庫之間的區別的文章,以首先了解它。
2. 7我為解決問題所做的工作
毫不奇怪,我使用了一個名為InstallCert.java的開源程序,它僅與您的LDAP服務器和端口一起運行,它將嘗試使用SSL連接LDAP服務器,并首先拋出相同的“ PKIX路徑構建失敗” ,然后拋出LDAP服務器返回的證書。
然后它將要求您將證書添加到密鑰庫中,只需提供屏幕上顯示的證書編號,然后將那些證書添加到C:\ Program Files \ Java \ jdk1.6.0 \ jre \ lib \ security文件夾中的“ jssecacerts ”中。 現在重新運行該程序,該錯誤必須消失,并且將打印:
"Loading KeyStore jssecacerts...Opening connection to stockmarket.com:636...Starting SSL handshake...No errors, the certificate is already trusted我們已經完成了,現在,如果您嘗試通過LDAPS進行身份驗證,您將成功。
即使沒有Spring安全性,也可以使用Java 對活動目錄執行LDAP認證的其他方法。 但是我發現spring-security非常有用,因此請考慮將其用于您的安全性要求。 如果您在LDAP登錄期間遇到任何問題,請告訴我,我們將盡力為您提供幫助。
翻譯自: https://www.javacodegeeks.com/2018/04/2-ways-to-setup-ldap-active-directory-authentication-in-java-spring-security-example-tutorial.html
總結
以上是生活随笔為你收集整理的Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 麻雀苏三省第几集死的 苏三省怎么死的
- 下一篇: 加密数据的检索_透明地持久保存并从数据库