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));
    


这段代码有问题。我将usernamepassword 放在LdapContextSource bean 中,这将在应用程序启动时使用。这不是我想要的,因为 usernamepassword 必须由用户在运行时提供。

但是!我发现了这个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 的用户账户概念的主要内容,如果未能解决你的问题,请参考以下文章

Spring LDAP vs UnboundId LDAP

Spring-Ldap连接Ldap及简单的增删查改

Spring LDAP 不适用于 LDAP 模板

Spring 安全 ldap 连接管理

微软安全公告 ADV190023 的 Spring Ldap 影响(LDAP 通道绑定和 LDAP 签名)

试图将 ldap 连接到 spring 项目 - LDAP:错误代码 32 - 没有这样的对象