Spring LDAP身份验证的用户帐户概念

时间:2018-03-23 09:14:16

标签: java spring spring-security active-directory ldap

我正在开发Spring Web应用程序的身份验证功能。客户已有一个现有的Active Directory及其员工数据。 AD中的任何员工都可以使用他们现有的用户名和密码登录我的Web应用程序,通过该应用程序,Web应用程序应使用给定的用户名和密码从AD获取员工数据,然后通过Web应用程序自动注册员工使用AD中的数据在DB中创建用户帐户记录。

以下是按顺序执行的上述操作。

  1. 用户提交包含用户名和密码的登录表单。
  2. Web应用程序使用给定的用户名和密码从AD查询人员数据。
  3. 网络应用程序使用人员数据在数据库中创建用户帐户记录。
  4. 我坚持第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 个答案:

答案 0 :(得分:4)

我不确定我的答案是否会澄清问题,但无论如何我都会尝试。

当我想将Camunda BPMN集成到现有应用程序中时,我遇到了同样的问题。作为初学者,我花了一些时间来实现LDAP协议的工作原理。

检查它,它可能有用:

https://docs.camunda.org/manual/7.7/user-guide/process-engine/identity-service/

如果有人发现我错了,请发表评论并纠正我。

事实上,硬编码凭证应该是经理,它将检查是否接受任何用户的给定用户名和密码(在应用程序内动态)。

管理员的信息也用于收集普通用户无法读取的LDAP组信息。

为了绕过这个问题,我实现了自己的身份验证类,尝试使用用户的凭据连接到LDAP,如果它抛出异常,则意味着给定的信息是错误的。但是,您将无法提供用户的组信息等。

对不起,我无法提供代码,因为我已经没有了。

祝你好运