Я разработал приложение Spring Boot и хочу выполнить аутентификацию с помощью сервера LDAP. В производстве это будет сервер Active Directory, но во время разработки я просто использую этот общедоступный сервер тестирования LDAP
Я заставил его работать, используя следующие классы:
Простой класс конфигурации LDAP.
Он читает из моего файла application.properties свойства, относящиеся к материалам LDAP.
@Configuration
public class LdapConfiguration {
//Getting values from properties file
@Value("${ldap.urls}")
private String ldapUrls;
@Value("${ldap.base.dn}")
private String ldapBaseDn;
@Value("${ldap.username}")
private String ldapSecurityPrincipal;
@Value("${ldap.password}")
private String ldapPrincipalPassword;
@Value("${ldap.user.dn.pattern}")
private String ldapUserDnPattern;
@Value("${ldap.enabled}")
private String ldapEnabled;
public LdapConfiguration() {
}
... getters and setters ...
}
И WebSecurityConfiguration, который фактически читает из класса LdapConfiguration, чтобы использовать его для аутентификации:
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private LdapConfiguration ldapConfiguration;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and()
.formLogin();
}
// Update configure method for the online test server
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.contextSource()
.url(ldapConfiguration.getLdapUrls() +ldapConfiguration.getLdapBaseDn())
.managerDn(ldapConfiguration.getLdapSecurityPrincipal())
.managerPassword(ldapConfiguration.getLdapPrincipalPassword())
.and()
.userDnPatterns(ldapConfiguration.getLdapUserDnPattern());
}
С этой конфигурацией аутентификация LDAP работает: я получаю красивую HTML-страницу с формой входа и, используя правильные учетные данные, могу использовать веб-сайт.
И вот моя проблема: после фазы входа в систему, если я запускаю что-то вроде
UserDetails ud = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
System.out.println(ud);
вот что я получу:
LdapUserDetailsImpl@fd8cece1:
Dn: uid=tesla,dc=example,dc=com;
Username: tesla;
Password: [PROTECTED];
Enabled: true;
AccountNonExpired: true;
CredentialsNonExpired: true;
AccountNonLocked: true;
Granted Authorities: ROLE_SCIENTISTS
Я ничего не понимаю, скажем, о полном имени Tesla (которое указано на сервере LDAP как поле CN).
Было бы неплохо получить все данные об аутентифицированном пользователе.
Конечно, я могу запустить отдельный запрос к серверу LDAP, задав подробности о пользователе с именем пользователя tesla. Однако это означает выполнение дополнительного запроса к серверу LDAP, поэтому это не кажется хорошим решением.
Есть ли способ указать, какие поля я хочу получать от сервера LDAP при выполнении аутентификации? (И сильно ли он меняется при работе с сервером Active Directory?)
Заранее спасибо.
На это ответили здесь: stackoverflow.com/questions/54242165/…