2011-05-09 259 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来恢复用户的信息。

相关问题