0

LDAP (Active Directory) で 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では class の代わりにインターフェイスを使用してい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()は、CN、DN、SN、メールなどの Active Directory 属性が返されます。attr.get(attribute)属性の値を返します。

于 2014-12-30T10:32:30.150 に答える