LDAP: получить пользовательские значения во время события аутентификации - PullRequest
0 голосов
/ 27 мая 2019

У меня есть Springboot, успешно проходящий аутентификацию на LDAP и добавляющий в представление модель CustomUserDetails.

Во время события аутентификации я также хотел бы вернуть дополнительные сведения, такие как электронная почта, телефон и город.

В соответствии с этим SO ответом это возможно, и я думаю, this также обращается к нему.

Несмотря на прочтение обоих этих ответов, я все еще не уверен, как поступитьсделать это - особенно о том, как соотносятся шаги 2 и 3 из второго ответа, и где отображаются такие данные, как электронная почта, город и телефон?

Мой класс безопасности:

Безопасность

@SpringBootApplication
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Override
public void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
                .anyRequest().fullyAuthenticated()
                .and()
            .formLogin()
                .defaultSuccessUrl("/newExhibit");
}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
            .userDetailsService(userDetailsService)
            .and()
            .ldapAuthentication()
            .userDnPatterns("uid={0},ou=people")
            .groupSearchBase("ou=groups")
            .contextSource()
            .url("ldap://localhost:8389/dc=springframework,dc=org")
            .and()
            .passwordCompare()
            .passwordEncoder(passwordEncoder())
            .passwordAttribute("userPassword");
}

Мой пользовательский объект из test-server.ldif

dn: uid=abc123,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Tom Smith
sn: Smith
uid: abc123
userPassword: pass
mail: tom@contoso.com
mobile: +212 307 12345
st: CA

После этого ответа мне нужно добавить в auth
(a) contextxtsource и
(b) userDetailsContextMapper?

В конечном итоге эти подробности из ldap я хотел бы сопоставить с моим классом пользователя java.

UPDATE

Обновленный AuthenticationManagerBUilder

@SpringBootApplication
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .userDetailsService(userDetailsService)
        .and()
        .ldapAuthentication()
        .userDnPatterns("uid={0},ou=people")
        .groupSearchBase("ou=groups")
        .contextSource()
        .userDetailsContextMapper(???) // what object in here and how initalised
        .url("ldap://localhost:8389/dc=springframework,dc=org")
        .and()
        .passwordCompare()
        .passwordEncoder(passwordEncoder())
        .passwordAttribute("userPassword");
}

1 Ответ

1 голос
/ 28 мая 2019

Глядя на ваш файл LDIF, я вижу, что вы пытаетесь получить свойства, которые определены как часть inetOrgPerson . Spring Security имеет готовый картограф для этого InetOrgPersonContextMapper. Это отобразит определенные свойства в InetOrgPerson, который будет действовать как необходимый UserDetails.

Для настройки вам просто нужно создать новый экземпляр и подключить его к вашей конфигурации.

@SpringBootApplication
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {


@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
      .ldapAuthentication()
        .userDnPatterns("uid={0},ou=people")
        .groupSearchBase("ou=groups")
        .contextSource()
        .url("ldap://localhost:8389/dc=springframework,dc=org")
        .and()
        .userDetailsContextMapper(new InetOrgPersonContextMapper())
        .passwordCompare()
        .passwordEncoder(passwordEncoder())
        .passwordAttribute("userPassword");
}

Это отобразит свойства соответственно. Поскольку вы используете LDAP, вам не нужно вводить UserDetailsService, так как он автоматически настроит LdapUserDetailsService снизу.

...