2011-05-09 269 views
1

我設法使用證書中找到的用戶名對Ldap進行身份驗證。我想獲得的是直接使用Ldap上的證書來驗證用戶身份。 我找不到如何將證書傳遞給Ldap。spring-security:使用用戶證書對LDAP進行身份驗證

這裏是當前的配置(使用證書的用戶名):

<security:x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/> 
<bean name="userService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService"> 
    <constructor-arg ref="ldapUserSearch"/> 
    <constructor-arg ref="ldapAuthoritiesPopulator"/> 
</bean> 
<bean name="ldapUserSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"> 
    <constructor-arg value=""/> 
    <constructor-arg value="sAMAccountName={0}"/> 
    <constructor-arg ref="contextSource" /> 
</bean> 
<bean name="ldapAuthoritiesPopulator" class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator"> 
    <constructor-arg ref="contextSource" /> 
    <constructor-arg value="" /> 
    <property name="groupSearchFilter" value="member={0}" /> 
    <property name="searchSubtree" value="true" /> 
</bean> 

回答

0

建立LDAP服務器使用SSL與客戶端身份驗證。

1

我一直在尋找這個問題,我自己。我還沒有找到X509->帳戶分辨率爲「正確」的認證堆棧。我掛斷了Spring Security的UserDetailsS​​ervice接口堅持使用字符串uid進行查找這一事實,但在許多情況下,從X509證書主題中包含的信息中派生出這樣的UID是不可能的(例如,有許多cn = John Smith在世界上,甚至在一個單一的組織內,也不需要證書DN中的電子郵件)。證書的唯一性在於發行人+序列號組合,而不是主體。

查看API後,有幾種方法可以解決這個問題。無論哪種方式可能都無法使用名稱空間並自行設置過濾器鏈和bean:

1)實現您自己的AuthenticationUserDetailsS​​ervice並將其綁定到PreAuthenticatedAuthenticationProvider。默認情況下,我相信,命名空間使用傳入的user-service-ref設置UserDetailsByNameServiceWrapper。走這條路線意味着您必須盡一切努力來設置UserDetails,包括授權的解決方案。當然,你可以委託所有這些,但它的更多的工作。

2)如果您的LDAP存儲是由一些UID鍵,這是我對傾斜的路線,實現自己的X509PrincipalExtractor並將其綁定到X509AuthenticationFilter並返回你的LDAPUserDetailsS​​ervice配置期望字符串UID。在提取器中實現邏輯,以在您的LDAP存儲中搜索存儲的證書。我不知道任何適用於LDAP服務器的策略,最簡單的方法是,如果您的LDAP支持RFC4523 certificateMatch或certificateExactMatch,並且您可以配置一個搜索過濾器,它將返回一個唯一的帳戶,然後您可以返回屬性需要(例如sAMAccountName)。如果不是,如果您的證書包含一個您可以過濾的值(例如,證書cn = LDAP cn),您可以使用該值來檢索候選LDAP結果集,將其證書提取到X509Certificate,並對傳遞的值執行.equals()在證書中查找匹配並返回其uid的帳戶。

0

最後,我實現了我的非Web應用程序如下sollution:

<bean id="x509ContextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <constructor-arg value="ldap://hostname:389/DC=base,DC=com" /> 
    <property name="authenticationStrategy"> 
     <bean class="org.springframework.ldap.core.support.ExternalTlsDirContextAuthenticationStrategy"> 
      <property name="sslSocketFactory"> 
       <bean class="yourOwnSocketFactory"/> 
      </property> 
      <property name="shutdownTlsGracefully" value="true" /> 
     </bean> 
    </property> 
</bean> 

其中yourOwnSocketFactory將用戶的證書來建立TLS連接。

成功的TLS連接意味着用戶已通過身份驗證。配置良好的LDAP就是這種情況,它應該檢查包括證書恢復列表的用戶。

建立連接後,您必須使用可以提取(X509PrincipalExtractor)證書DN(或其他有用信息)以匹配LDAP用戶的自定義BindAuthenticator來恢復用戶的信息。

相關問題