Кажется, проблема в том, что createBindPrincipal()
внутри ActiveDirectoryLdapAuthenticationProvider
проверяет, заканчивается ли username
на domain
, а если нет, то добавляет его . Это приводит к тому, что имя пользователя становится john.doe@bar.com@foo.bar.com
К сожалению, ActiveDirectoryLdapAuthenticationProvider
является окончательным, поэтому не может его переопределить. Решение, которое мы использовали, заключается в том, чтобы не передавать domain
, а вместо rootDN
(созданный путем копирования кода из ActiveDirectoryLdapAuthenticationProvider
)
private AuthResultDto loginAD(LoginDto login) {
String adDomain = env.getProperty("xxx.api.auth.ad.domain");
String adUrl = env.getProperty("xxx.api.auth.ad.url");
ActiveDirectoryLdapAuthenticationProvider provider =
new ActiveDirectoryLdapAuthenticationProvider(null, adUrl, rootDnFromDomain(adDomain));
provider.setConvertSubErrorCodesToExceptions(true);
provider.setUseAuthenticationRequestCredentials(true);
provider.setUserDetailsContextMapper(new InetOrgPersonContextMapper());
Authentication auth = provider
.authenticate(new UsernamePasswordAuthenticationToken(login.getEmail(), login.getPassword()));
if (!auth.isAuthenticated())
throw new CustomMessageException("Invalid Login");
...
}
// copied from ActiveDirectoryLdapAuthenticationProvider
private String rootDnFromDomain(String domain) {
String[] tokens = StringUtils.tokenizeToStringArray(domain, ".");
StringBuilder root = new StringBuilder();
for (String token : tokens) {
if (root.length() > 0) {
root.append(',');
}
root.append("dc=").append(token);
}
return root.toString();
}