0

我正在使用带有 LDAP(活动目录)的 Spring Security,我能够通过扩展 LdapUserDetailsMapper 来验证用户并创建自己的用户详细信息对象。
默认情况下,我得到某些字段和组以及 DN。
但我想获得 Active Directory 中可用的其他字段,例如电子邮件、联系电话。

那么如何获取这些信息呢?

我的配置

 @Bean
    public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
        ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("hmie.co.in", "ldap://1.1.1.1:389/");
        provider.setConvertSubErrorCodesToExceptions(true);
        provider.setUseAuthenticationRequestCredentials(true);
        provider.setUserDetailsContextMapper(userDetailsContextMapper);
        return provider;
    }

自定义用户详细信息映射

@Service
public class MyUserDetailsContextMapper extends LdapUserDetailsMapper implements UserDetailsContextMapper {

   @Override
    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<?    extends GrantedAuthority> authorities) {
        LdapUserDetailsImpl ldapUserDetailsImpl = (LdapUserDetailsImpl) super.mapUserFromContext(ctx, username, authorities);     
        MyUserDetails myUserDetails = new MyUserDetails();
        myUserDetails.setAccountNonExpired(ldapUserDetailsImpl.isAccountNonExpired());
        myUserDetails.setAccountNonLocked(ldapUserDetailsImpl.isAccountNonLocked());
        myUserDetails.setCredentialsNonExpired(ldapUserDetailsImpl.isCredentialsNonExpired());
        myUserDetails.setEnabled(ldapUserDetailsImpl.isEnabled());
        myUserDetails.setUsername(ldapUserDetailsImpl.getUsername());
        myUserDetails.setAuthorities(ldapUserDetailsImpl.getAuthorities());
        String dn = ldapUserDetailsImpl.getDn();
        int beginIndex = dn.indexOf("cn=") + 3;
        int endIndex = dn.indexOf(",");
        myUserDetails.setEmployeeName(dn.substring(beginIndex, endIndex));
        beginIndex = dn.indexOf("ou=") + 3;
        endIndex = dn.indexOf(",", beginIndex);
        myUserDetails.setDepartment(dn.substring(beginIndex, endIndex));   
        return myUserDetails;
    }
}
4

2 回答 2

0

为了获得完整的 LDAP 目录属性和值,我这样做了。但在这里我使用的是接口org.springframework.ldap.core.AttributesMapper而不是类org.springframework.security.ldap.userdetails.LdapUserDetailsMapper

         ldapTemplate.search("o=XXXXX", new EqualsFilter("uid", userName).encode(),
              new AttributesMapper() {

                     @Override
                     public Object mapFromAttributes(Attributes attr) throws NamingException {
                          // TODO Auto-generated method stub
                          NamingEnumeration<String> namingEnumeration = attr.getIDs();
                          while (namingEnumeration.hasMoreElements()) {
                               String attributeName= (String) namingEnumeration.nextElement();
                               System.out.println(attributeName+" = "+attr.get(attributeName));
                          }
                          return null;
                     }
           });

在上面的代码中,attr.getIDs()返回 Active Directory 属性,如 CN、DN、SN 和邮件。attr.get(attribute)返回属性的值。

于 2014-12-30T10:32:30.150 回答
0

里面的代码mapUserFromContext接近!关键细节是ctx传递给该方法的对象已经包含主体的附加 Active Directory 属性。可以使用方法访问属性值ctx.getStringAttribute("attribute-name")。例如,您可以使用 访问主体的 surname 属性ctx.getStringAttribute("sn")。要获取用户的电子邮件和联系电话,您只需访问相应的属性。在我公司的 Active Directory 中,这些属性分别是mailphone。在您的系统中,这些属性的名称可能不同。

于 2017-07-18T00:55:53.287 回答