我已经开发了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页面,并使用了可以使用该网站的适当凭据。
这是我的问题:在登录阶段之后,如果我运行类似
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服务器时,它会发生很大变化吗?)
谢谢。