Spring LDAP Authentication 的用户账户概念
Posted
技术标签:
【中文标题】Spring LDAP Authentication 的用户账户概念【英文标题】:Spring LDAP Authentication's user account concepts 【发布时间】: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
中设置的用户名/密码是否应该由用户提供,或者我应该有一个单独的用户名/密码,仅用于我的应用程序?
【问题讨论】:
【参考方案1】:我不确定我的回答是否能澄清问题,但我还是会尝试。
当我想将 Camunda BPMN 集成到现有应用程序中时,我遇到了同样的问题。作为初学者,我花了一些时间才意识到 LDAP 协议的工作原理。
检查一下,它可能有用:
https://docs.camunda.org/manual/7.7/user-guide/process-engine/identity-service/
如果有人发现我错了,请在下面评论并纠正我。
事实上,硬编码的凭据应该是管理员的,它将检查是否接受任何用户的给定用户名和密码(在应用程序内动态)。
管理员信息也用于收集普通用户无法读取的LDAP组信息。
为了绕过这个问题,我实现了自己的身份验证类,它尝试使用用户的凭据连接到 LDAP,如果它抛出异常,则意味着给定的信息是错误的。但是,您将无法提供用户的群组信息等。
很抱歉,我无法提供代码,因为我没有它了。
祝你好运
【讨论】:
如果您使用该用户登录,您应该能够获取其组。以上是关于Spring LDAP Authentication 的用户账户概念的主要内容,如果未能解决你的问题,请参考以下文章