spring ldap 模板认证
spring ldap template authentication
我正在尝试通过 spring ldap 对用户进行身份验证。以下是初始化 ldap 模板的代码。
contextSource = new LdapContextSource();
contextSource.setUrl("ldaps://ldap.example.com");
contextSource.setBase("DC=example,DC=com");
contextSource.setUserDn("backend-app");
contextSource.setPassword("password");
contextSource.afterPropertiesSet();
PoolingContextSource pooledContextSource = new PoolingContextSource();
pooledContextSource.setDirContextValidator(new
DefaultDirContextValidator());
pooledContextSource.setContextSource(contextSource);
ldapTemplate = new LdapTemplate(pooledContextSource);
ldapTemplate.afterPropertiesSet();
当我尝试使用 ldapTemplate 身份验证方法时,它 returns 错误。
// below line fails
ldapTemplate.authenticate("OU=Service Accounts,OU=Pseudo-Users", "frontend-web", "password");
但是当我使用目录上下文时它有效
DirContext ctx = null;
try {
ctx = contextSource.getContext("frontend-web", "password");
return true;
} catch (Exception e) {
logger.error("Login failed", e);
return false;
} finally {
LdapUtils.closeContext(ctx);
}
问题 1: 有什么方法可以使 ldaptemplate 身份验证方法起作用吗?
问题2:为什么我们直接使用DirectoryContext时不用提供baseDn。 ldap 如何知道在哪里可以找到用户 "frontend-web"。它是否在整个目录中搜索用户 "frontend-web"
谁能帮忙。
问题 1 - 我 运行 遇到了完全相同的问题....仍然没有弄清楚如何使用我现有的 LDAP 模板。我将 ldap 配置直接注入到我的服务中,并创建了一个新的 "private" 未合并的 ldapTemplate,如下所示:
public class AuthController {
private final LdapTemplate ldapTemplate;
AuthController(MyLdapConfig config) {
LdapContextSource contextSource = new LdapContextSource();
contextSource.setUrl(config.getUrl());
contextSource.setUserDn(config.getUserDn());
contextSource.setPassword(config.getPassword());
contextSource.afterPropertiesSet();
ldapTemplate = new LdapTemplate(contextSource);
ldapTemplate.setIgnorePartialResultException(true);
}
@PostMapping
public ResponseEntity authenticate(@RequestBody AuthenticationRequest authenticationRequest) {
if (authenticateUser(authenticationRequest.getUsername(), authenticationRequest.getPassword())) {
return ResponseEntity.ok().build();
}
log.warn("authentication failed for {}", authenticationRequest.getUsername());
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
// authenticateUser method omitted
}
问题 2 - 是
the search always starts at the root of the tree (the empty path)
https://docs.spring.io/spring-ldap/docs/2.3.1.RELEASE/reference/#basic-authentication
我正在尝试通过 spring ldap 对用户进行身份验证。以下是初始化 ldap 模板的代码。
contextSource = new LdapContextSource();
contextSource.setUrl("ldaps://ldap.example.com");
contextSource.setBase("DC=example,DC=com");
contextSource.setUserDn("backend-app");
contextSource.setPassword("password");
contextSource.afterPropertiesSet();
PoolingContextSource pooledContextSource = new PoolingContextSource();
pooledContextSource.setDirContextValidator(new
DefaultDirContextValidator());
pooledContextSource.setContextSource(contextSource);
ldapTemplate = new LdapTemplate(pooledContextSource);
ldapTemplate.afterPropertiesSet();
当我尝试使用 ldapTemplate 身份验证方法时,它 returns 错误。
// below line fails
ldapTemplate.authenticate("OU=Service Accounts,OU=Pseudo-Users", "frontend-web", "password");
但是当我使用目录上下文时它有效
DirContext ctx = null;
try {
ctx = contextSource.getContext("frontend-web", "password");
return true;
} catch (Exception e) {
logger.error("Login failed", e);
return false;
} finally {
LdapUtils.closeContext(ctx);
}
问题 1: 有什么方法可以使 ldaptemplate 身份验证方法起作用吗?
问题2:为什么我们直接使用DirectoryContext时不用提供baseDn。 ldap 如何知道在哪里可以找到用户 "frontend-web"。它是否在整个目录中搜索用户 "frontend-web"
谁能帮忙。
问题 1 - 我 运行 遇到了完全相同的问题....仍然没有弄清楚如何使用我现有的 LDAP 模板。我将 ldap 配置直接注入到我的服务中,并创建了一个新的 "private" 未合并的 ldapTemplate,如下所示:
public class AuthController {
private final LdapTemplate ldapTemplate;
AuthController(MyLdapConfig config) {
LdapContextSource contextSource = new LdapContextSource();
contextSource.setUrl(config.getUrl());
contextSource.setUserDn(config.getUserDn());
contextSource.setPassword(config.getPassword());
contextSource.afterPropertiesSet();
ldapTemplate = new LdapTemplate(contextSource);
ldapTemplate.setIgnorePartialResultException(true);
}
@PostMapping
public ResponseEntity authenticate(@RequestBody AuthenticationRequest authenticationRequest) {
if (authenticateUser(authenticationRequest.getUsername(), authenticationRequest.getPassword())) {
return ResponseEntity.ok().build();
}
log.warn("authentication failed for {}", authenticationRequest.getUsername());
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
// authenticateUser method omitted
}
问题 2 - 是
the search always starts at the root of the tree (the empty path)
https://docs.spring.io/spring-ldap/docs/2.3.1.RELEASE/reference/#basic-authentication