我正在开发Spring Web应用程序的身份验证功能。客户已有一个现有的Active Directory及其员工数据。 AD中的任何员工都可以使用他们现有的用户名和密码登录我的Web应用程序,通过该应用程序,Web应用程序应使用给定的用户名和密码从AD获取员工数据,然后通过Web应用程序自动注册员工使用AD中的数据在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
中设置的用户名/密码,或者我的应用程序是否应该使用单独的用户名/密码?
答案 0 :(得分:4)
我不确定我的答案是否会澄清问题,但无论如何我都会尝试。
当我想将Camunda BPMN集成到现有应用程序中时,我遇到了同样的问题。作为初学者,我花了一些时间来实现LDAP协议的工作原理。
检查它,它可能有用:
https://docs.camunda.org/manual/7.7/user-guide/process-engine/identity-service/
如果有人发现我错了,请发表评论并纠正我。
事实上,硬编码凭证应该是经理,它将检查是否接受任何用户的给定用户名和密码(在应用程序内动态)。
管理员的信息也用于收集普通用户无法读取的LDAP组信息。
为了绕过这个问题,我实现了自己的身份验证类,尝试使用用户的凭据连接到LDAP,如果它抛出异常,则意味着给定的信息是错误的。但是,您将无法提供用户的组信息等。
对不起,我无法提供代码,因为我已经没有了。
祝你好运