您应该看看UserDetailsContextMapper
。已经有实现类自动映射LDAP对象的一些属性,如InetOrgPersonContextMapper
或PersonContextMapper
。如果有任何特殊属性,您必须注册您自己的,例如我们使用属性manager
和directReports
报告存储在AD中的行,我必须手动进行映射。
public class CustomUserDetailsContextMapper extends LdapUserDetailsMapper implements UserDetailsContextMapper {
@Autowired
private LdapUserService ldapUserService;
@Override
public UserDetails mapUserFromContext(DirContextOperations ops, String username,
Collection<? extends GrantedAuthority> authorities) {
UserDetails details = super.mapUserFromContext(ops, username, authorities);
String manager = ops.getStringAttribute("manager");
String[] directReports = ops.getStringAttributes("directReports");
User user = new User(
username,
"",
details.isEnabled(),
details.isAccountNonExpired(),
details.isCredentialsNonExpired(),
details.isAccountNonLocked(),
details.getAuthorities(),
manager,
directReports);
return user;
}
@Override
public void mapUserToContext(UserDetails user, DirContextAdapter dir) {
super.mapUserToContext(user, dir);
}
}
而且很明显,你还必须调整你的UserDetails
还有:
public class User extends org.springframework.security.core.userdetails.User {
private String manager;
private String[] directReports;
public User(String username, String password, boolean enabled, boolean accountNonExpired,
boolean credentialsNonExpired, boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities) {
super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
}
public User(String username, String password, boolean enabled, boolean accountNonExpired,
boolean credentialsNonExpired, boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities, String manager, String[] directReports) {
this(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
this.manager = manager;
this.directReports = directReports;
}
public String getManager() {
return manager;
}
public String[] getDirectReports() {
return directReports;
}
}
希望这有助于。