使用 Spring 安全性与 Active Directory 进行 x509 身份验证

Posted

技术标签:

【中文标题】使用 Spring 安全性与 Active Directory 进行 x509 身份验证【英文标题】:x509 authentication with Active directory using Spring security 【发布时间】:2013-05-09 17:42:57 【问题描述】:

您好,我是 Spring 安全新手, 我的任务是通过匹配从 x509 客户端证书检索到的用户名来针对活动目录对用户进行身份验证。 到目前为止,我所做的是启用 ssl 相互身份验证

上面的部分工作正常,现在我有 security.xml 文件,我在其中配置了与 x509 引用和 Active Directory 配置相关的所有内容

      <global-method-security secured-annotations="enabled" />

             <http > 
              <intercept-url pattern="/**" access="ROLE_USER,ROLE_ANONYMOUS" requires-     channel="https"/>
     <intercept-url pattern="/UserLogin/*"  access="ROLE_ADMIN,ROLE_USER" requires-channel="https"/>
         <x509 subject-principal-regex="CN=(.*?)," user-service-ref="ldapUserService" />  
</http>

<authentication-manager>
         <authentication-provider user-service-ref="ldapUserService" />
 </authentication-manager>

  <bean:bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
  <bean:constructor-arg value="ldap://ActiveDirectoryURL:389/CN=example,DC=net"/>
  <bean:property name="userDn" value="mkanaka@example.local"/>
<bean:property name="password" value="secuera1SMK"/>
</bean:bean> 

<bean:bean name="ldapUserService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService">
    <bean:constructor-arg ref="ldapUserSearch"/>
    <bean:constructor-arg ref="ldapAuthoritiesPopulator"/>
</bean:bean>
<bean:bean name="ldapUserSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <bean:constructor-arg value=""/>
    <bean:constructor-arg value="(&amp;(sAMAccountName=0)(objectclass=Users))"/>
    <bean:constructor-arg ref="contextSource" />
</bean:bean>
<bean:bean name="ldapAuthoritiesPopulator" 

class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
    <bean:constructor-arg ref="contextSource" />
    <bean:constructor-arg value="" />
    <bean:property name="groupSearchFilter" value="member=0" />
    <bean:property name="searchSubtree" value="true" />
</bean:bean>

现在我面临的问题是当我尝试检索 SecurityContextHolder.getContext().getAuthentication().getPrincipal();它的返回类型是字符串而不是 userDetails(记录时使用的证书详细信息),getPrincipal() 的字符串输出是 anonymousUser 并且它给出的权限是 ROLE_ANONYMOUS 但是当我调用 getAuthentication .isAuthenticated() 它返回 true。 我正在使用 tomcat 7、Spring 安全 3.1 可能是什么问题请在这方面帮助我

【问题讨论】:

这是未经身份验证用户的预期行为。您是否验证了身份验证实际上已成功进行(例如,通过检查调试日志)? 我已启用日志记录,现在我可以在日志中看到 org.springframework.security.core.userdetails.UsernameNotFoundException: User Mohankumar Kanaka not found in directory 小提示,我的主题 DN证书中的内容类似于 CN=Mohankumar Kanaka,CN=Users,DC=rvalidedc,DC=local ,其中活动目录的登录名称为 mkanaka@rvalidedc.local 这是问题吗? mkanaka 帐户的显示在哪里是 Mohankumar kanaka 我认为在进行活动目录搜索时会考虑它?感谢卢克的帮助。 【参考方案1】:

根据您的配置,从证书中提取的用户名将是“Mohankumar Kanaka”,这就是 Spring Security 将尝试用于身份验证的用户名。

使用您的 LDAP 配置,它将搜索具有与此匹配的 sAMAccountName 属性的目录条目(它没有找到)。

您需要通过某种方式将证书中的名称映射到 Active Directory 条目。 Spring Security 无法自动为您做到这一点。理想情况下,证书中的部分主题名称应与 AD 用户名匹配,以便您轻松提取。

【讨论】:

嗨,我们如何使用活动目录验证从 httpservletrequest 检索到的公钥证书。Spring 文档中讨论主题名称时给出的配置。请在这方面帮助我 对不起,除了我已经写的内容之外,我真的没有其他要补充的了。您需要在问题中解释证书和 AD 帐户是如何连接的。如果不是,那么显然您无法针对 AD 验证证书。

以上是关于使用 Spring 安全性与 Active Directory 进行 x509 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

spring.profiles.active和spring.profiles.include的使用与区别

具有 Active Directory 和数据库角色的 Spring Security

“检测到缺陷令牌”错误(NTLM 不是 Kerberos)与 Kerberos/Spring Security/IE/Active Directory

使用 spring.profiles.active来区分配置

JMS 之 Active MQ 的spring整合

spring.profiles.active=@profiles.active@的含义