【发布时间】:2018-09-01 21:58:04
【问题描述】:
我正在开发 Spring Web 应用程序的身份验证功能。客户已经拥有一个包含其员工数据的现有 Active Directory。 AD中的任何员工都可以使用他们现有的用户名和密码登录我的Web应用程序,Web应用程序应使用给定的用户名和密码从AD中获取员工数据,然后通过以下方式自动将员工注册到Web应用程序使用 AD 中的数据在 DB 中创建用户帐户记录。
以下是按顺序排列的上述动作。
- 用户提交带有用户名和密码的登录表单。
- Web 应用使用给定的用户名和密码从 AD 查询员工数据。
- Web 应用使用员工数据在 DB 中创建用户帐户记录。
我被第 2 步卡住了。因为这是我第一次使用 LDAP,所以我对这个主题的理解很浅。
目前我可以使用以下代码成功列出 AD 中的所有人名。
@SpringBootApplication
public class Main implements ApplicationRunner {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
@Autowired
private LdapTemplate ldapTemplate;
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
@Override
public void run(ApplicationArguments args) throws Exception {
logger.info("----------------------");
logger.info(getAllPersonNames().toString());
logger.info("----------------------");
}
private List getAllPersonNames() {
EqualsFilter filter = new EqualsFilter("objectclass", "person");
return ldapTemplate.search(DistinguishedName.EMPTY_PATH, filter.encode(),
(AttributesMapper) attrs -> attrs.get("cn").get());
}
@Bean
public LdapContextSource contextSource(Environment env) {
LdapContextSource contextSource = new LdapContextSource();
contextSource.setUrl("ldap://localhost:5555");
contextSource.setBase("DC=myorg,DC=com");
contextSource.setUserDn("username");
contextSource.setPassword("password");
return contextSource;
}
@Bean
public LdapTemplate ldapTemplate(Environment env) {
return new LdapTemplate(contextSource(env));
}
}
这段代码有问题。我将username 和password 放在LdapContextSource bean 中,这将在应用程序启动时使用。这不是我想要的,因为 username 和 password 必须由用户在运行时提供。
但是!我发现了这个example 并开始感到困惑。在示例中,有两组用户名和密码,一组用于设置LdapContextSource,一组由用户在运行时提供。
所以我想我可能有一些误解。 请帮助澄清LdapContextSource 中设置的用户名/密码是否应该由用户提供,或者我应该有一个单独的用户名/密码,仅用于我的应用程序?
【问题讨论】:
标签: java spring spring-security active-directory ldap