【发布时间】:2018-05-28 11:35:00
【问题描述】:
在我的 Spring Web 应用程序中,我无法从当前使用 Active Directory 帐户登录的用户检索正确的 objectId。所有属性似乎都有正确的值,但objectId 的值始终设置为S-1-5-21-1723711471-3183472479-4012130053-3220159935,我不知道它来自哪里。
WebSecurityConfig
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.authenticationProvider(activeDirectoryLdapAuthenticationProvider());
}
private ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
ActiveDirectoryLdapAuthenticationProvider provider =
new ActiveDirectoryLdapAuthenticationProvider(LdapConfig.AD_DOMAIN, LdapConfig.AD_SERVER);
provider.setUserDetailsContextMapper(new LdapUserDetailsContextMapper());
return provider;
}
}
LdapUserDetailsContextMapper
@Slf4j
public class LdapUserDetailsContextMapper implements UserDetailsContextMapper {
@Override
public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> collection) {
log.info("username: " + username); //username is correct
log.info("DN from ctx: " + ctx.getDn()); // returns correct DN
byte[] byteSid = ctx.getStringAttribute("objectSid").getBytes();
String sid = LdapUtils.convertBinarySidToString(byteSid);
log.info("SID: " + sid); // S-1-5-21-1723711471-3183472479-4012130053-3220159935 everytime
return new User(username, "notUsed", true, true, true, true,
AuthorityUtils.createAuthorityList("ROLE_USER"));
}
@Override
public void mapUserToContext(UserDetails userDetails, DirContextAdapter dirContextAdapter) {
}
}
如何从 Active Directory 中获取正确的 SID?
【问题讨论】:
-
所有用户都一样吗?
-
是的,完全正确,它与我添加的任何用户都不匹配(我没有通过这个 SID 搜索整个目录)。
-
不同用户的最后一块字符应该不同。如果不是,比较两个用户的sid的字节流,看是否匹配。 Sid 将是独一无二的。
-
ctx.getDn()是您希望从中获取 SID 的用户帐户的 DN? -
@GabrielLuci 是的 :)
标签: java spring spring-security active-directory spring-ldap