Spring Boot LDAP身份验证:通过身份验证获取用户数据

时间:2019-01-10 17:36:07

标签: spring spring-boot authentication active-directory ldap

我已经开发了Spring Boot应用程序,并且想使用LDAP服务器执行身份验证。 在生产环境中,它将是一台Active Directory服务器,但是在开发过程中,我只是使用this public LDAP testing server

我使用以下类来使其工作:

一个简单的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页面,并使用了可以使用该网站的适当凭据。login form

这是我的问题:在登录阶段之后,如果我运行类似

    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

我对特斯拉的全名(LDAP服务器中的CN字段)一无所知。 最好获取有关已认证用户的所有数据。

当然,我可以对LDAP服务器运行一个单独的查询,询问有关用户名tesla的用户的详细信息。但是,这意味着向LDAP服务器提出了额外的请求,因此这似乎不是一个好的解决方案。

在执行身份验证时,是否可以指定我想从LDAP服务器获取哪些字段? (在使用Active Directory服务器时,它会发生很大变化吗?)

谢谢。

0 个答案:

没有答案