Нужно ли нам писать CustomActiveDirectoryLdapAuthenticationProvider, если мы хотим получить информацию о пользователе из ActiveDirectory
Если нам нужно получить атрибуты пользователя из 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/active-directory-spring-security/
1 ответ
Вы не. 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.