Нужно ли нам писать CustomActiveDirectoryLdapAuthenticationProvider, если мы хотим получить информацию о пользователе из ActiveDirectory - PullRequest
0 голосов
/ 17 января 2019

Если нам нужно получить атрибуты пользователя из ActiveDirectory, такие как name, sn и т. Д., Мы не можем настроить их с помощью специализированного поставщика аутентификации LDAP, который использует соглашения о конфигурации Active Directory, такие как «springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider»

 @Override
    protected void configure(HttpSecurity http) throws Exception {

            http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                        .authorizeRequests().antMatchers("/", "logout").permitAll().and().httpBasic();
    }


     @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception { 

            auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider());
        }

     @Bean
        public AuthenticationManager authenticationManager() {

         return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
        }

     @Bean
        public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {

            ActiveDirectoryLdapAuthenticationProvider adProvider = new ActiveDirectoryLdapAuthenticationProvider(domain, url);
            adProvider.setConvertSubErrorCodesToExceptions(true);
            adProvider.setUseAuthenticationRequestCredentials(true);

            return adProvider;
        }

, а затем используйте AuthenticationManager, как показано ниже.

Authentication auth = new UsernamePasswordAuthenticationToken(userName, password);
        Authentication a = authenticationManager.authenticate(auth);

Но я получаю a.isAuthenticated () как true для правильного имени пользователя и пароля, я также получаю a.getName () в качестве моего имени пользователя. Но, как получить sn, dispalyname, name и другие атрибуты. Нужно ли нам писать CustomActiveDirectoryLdapAuthenticationProvider, как упомянуто здесь http://code -addict.pl / активный каталог весна-безопасность /

1 Ответ

0 голосов
/ 17 января 2019

Вы нет. Spring Security поставляется с интерфейсом UserDetailsContextMapper

/**
 * Creates a fully populated UserDetails object for use by the security framework.
 *
 * @param ctx the context object which contains the user information.
 * @param username the user's supplied login name.
 * @param authorities
 * @return the user object.
 */
UserDetails mapUserFromContext(DirContextOperations ctx, String username,
        Collection<? extends GrantedAuthority> authorities);

Реализация по умолчанию, LdapUserDetailsMapper

В настоящее время отображаются только группы, возвращенные поиском.

// Map the roles
for (int i = 0; (this.roleAttributes != null)
        && (i < this.roleAttributes.length); i++) {
    String[] rolesForAttribute = ctx.getStringAttributes(this.roleAttributes[i]);

    if (rolesForAttribute == null) {
        this.logger.debug("Couldn't read role attribute '"
                + this.roleAttributes[i] + "' for user " + dn);
        continue;
    }
        for (String role : rolesForAttribute) {
        GrantedAuthority authority = createAuthority(role);
            if (authority != null) {
            essence.addAuthority(authority);
        }
    }
}

Однако, реализовав свой собственный UserDetailsMapper , вы можете получить любые записи, которые возвращаются из LDAP.

Вы просто решаете, какой атрибут вы хотите получить

Object attribute = ctx.getObjectAttribute("some-ldap-attribute");

Это способ извлечения пользовательских значений во время события аутентификации.

Если вы хотите просто запрашивать, искать и извлекать данные из каталога LDAP, вы можете использовать SpringSecurityLdapTemplate

Он имитирует то, что RestTemplate делает для HTTP, но для LDAP.

...