spring安全性:使用用户';要根据LDAP进行身份验证的证书
我设法使用证书中的用户名根据Ldap对用户进行身份验证。我希望获得的是直接使用Ldap上的证书对用户进行身份验证。 我找不到如何将证书传递到Ldap 以下是当前配置(使用证书的用户名):spring安全性:使用用户';要根据LDAP进行身份验证的证书,ldap,spring-security,certificate,x509,Ldap,Spring Security,Certificate,X509,我设法使用证书中的用户名根据Ldap对用户进行身份验证。我希望获得的是直接使用Ldap上的证书对用户进行身份验证。 我找不到如何将证书传递到Ldap 以下是当前配置(使用证书的用户名): 将LDAP服务器设置为使用SSL进行客户端身份验证。将LDAP服务器设置为使用SSL进行客户端身份验证。我自己也在关注这个问题。我还没有找到一个身份验证堆栈,它可以执行X509->accountresolution“right”。Spring Security的UserDetailsService接口坚持使用
将LDAP服务器设置为使用SSL进行客户端身份验证。将LDAP服务器设置为使用SSL进行客户端身份验证。我自己也在关注这个问题。我还没有找到一个身份验证堆栈,它可以执行X509->accountresolution“right”。Spring Security的UserDetailsService接口坚持使用字符串uid进行查找,但在许多情况下,不可能从X509证书主题中包含的信息中派生出这样的uid(例如,世界上有许多cn=John Smith,甚至在单个组织内,证书DN中也不需要电子邮件)。证书的唯一性在于颁发者+序列号组合,而不是主题
在浏览了API之后,有几种方法可以实现这一点。任何一种方法都可能阻止使用名称空间并自行设置过滤器链和bean:
1) 实现您自己的AuthenticationUserDetails服务,并将其绑定到预验证的身份验证提供程序。我认为,默认情况下,名称空间使用传入的user-service-ref设置UserDetailsByNameServiceWrapper。执行此路径意味着您必须尽一切努力设置UserDetails,包括授予的权限解析。当然,你可以授权所有这些,但这需要更多的工作
2) 如果您的LDAP存储由某个UID设置密钥,而这正是我所倾向的路径,请实现您自己的X509PrincipalExtractor并将其绑定到X509AuthenticationFilter,然后返回LDAPUserDetails服务配置为期望的字符串UID。在提取器中,实现逻辑来搜索LDAP存储以查找存储的证书。我不知道有什么策略可以跨LDAP服务器工作,最简单的方法是,如果您的LDAP支持RFC4523 certificateMatch或certificateExactMatch,并且您可以配置一个搜索筛选器,该筛选器将返回一个唯一的帐户,然后您可以从中返回所需的属性(例如sAMAccountName)。如果不是,则如果您的证书包含可用于检索候选LDAP结果集的筛选值(例如证书cn=LDAP cn),则将其证书提取到X509Certificate并执行.equals()根据传入的证书查找匹配的帐户并返回其uid。我自己也在研究这个问题。我还没有找到一个身份验证堆栈,它可以执行X509->accountresolution“right”。Spring Security的UserDetailsService接口坚持使用字符串uid进行查找,但在许多情况下,不可能从X509证书主题中包含的信息中派生出这样的uid(例如,世界上有许多cn=John Smith,甚至在单个组织内,证书DN中也不需要电子邮件)。证书的唯一性在于颁发者+序列号组合,而不是主题 在浏览了API之后,有几种方法可以实现这一点。任何一种方法都可能阻止使用名称空间并自行设置过滤器链和bean: 1) 实现您自己的AuthenticationUserDetails服务,并将其绑定到预验证的身份验证提供程序。我认为,默认情况下,名称空间使用传入的user-service-ref设置UserDetailsByNameServiceWrapper。执行此路径意味着您必须尽一切努力设置UserDetails,包括授予的权限解析。当然,你可以授权所有这些,但这需要更多的工作
2) 如果您的LDAP存储由某个UID设置密钥,而这正是我所倾向的路径,请实现您自己的X509PrincipalExtractor并将其绑定到X509AuthenticationFilter,然后返回LDAPUserDetails服务配置为期望的字符串UID。在提取器中,实现逻辑来搜索LDAP存储以查找存储的证书。我不知道有什么策略可以跨LDAP服务器工作,最简单的方法是,如果您的LDAP支持RFC4523 certificateMatch或certificateExactMatch,并且您可以配置一个搜索筛选器,该筛选器将返回一个唯一的帐户,然后您可以从中返回所需的属性(例如sAMAccountName)。如果不是,则如果您的证书包含可用于检索候选LDAP结果集的筛选值(例如证书cn=LDAP cn),则将其证书提取到X509Certificate,并对传入的证书执行.equals(),以查找匹配的帐户并返回其uid。最后,我在非web应用程序中实现了以下解决方案:
<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就是这种情况,它应该检查用户,包括证书更新列表
建立连接后,您必须使用自定义BindAuthenticator恢复用户信息,该验证器可以提取(X509T)证书DN(或其他有用信息)以匹配LDAP用户。最后,我在非web应用程序中实现了以下解决方案:
<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连接意味着