当前位置: 首页 > 知识库问答 >
问题:

Spring MVC中的Ldap身份验证

陶裕
2023-03-14

我正在尝试为我的Spring MVC应用程序集成LDAP身份验证。如果我将contextSource设置为虚拟用户DN和相应的密码,则用户可以成功登录。我想做的是能够在不使用虚拟用户的情况下绑定ldap连接。

下面是工作原理的代码-

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http

            .authorizeRequests()
                .antMatchers("/css/**").permitAll()
                .antMatchers("/","/login**").permitAll()
                .antMatchers("/home_vm","/details/**").authenticated() 
                .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .defaultSuccessUrl("/home_vm", true)
                .and()
            .logout()
                .permitAll();

        http.headers().httpStrictTransportSecurity();

    }

    @Configuration
    @Profile({"default", "opt_ad_auth"})
    protected static class ActiveDirectoryAuthenticationConfiguration extends
            GlobalAuthenticationConfigurerAdapter {
        @Value("${app.ldap.url}")
        private String ldapURL;
        @Override
        public void init(AuthenticationManagerBuilder auth) throws Exception {


             DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(ldapURL);

           contextSource.setUserDn("cn=Dummy User,cn=Users,dc=somecompany,dc=com");



              contextSource.setPassword("mypassword");

            contextSource.setReferral("follow"); 

            contextSource.afterPropertiesSet();



                auth.ldapAuthentication()

                .userSearchFilter("(sAMAccountName={0})")

                    .contextSource(contextSource)
                    ;

        }
    }   
}

现在我已经尝试删除硬编码的userDn和密码(更新init())-

public void init(AuthenticationManagerBuilder auth) throws Exception {   
                auth.ldapAuthentication()
                .userSearchFilter("(sAMAccountName={0})")
                .contextSource()
                .url(ldapURL)
                    ;
        }
    }

应用程序启动正常,但我遇到了一个例外——“必须在连接上成功绑定”。

Stacktrace-

org.springframework.security.authentication.InternalAuthenticationServiceException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: [LDAP: error code 1 - 000004DC: LdapErr: DSID-0C0906E8, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v1db1

[UPDATE]我已经将init方法修改为以下内容,以便更紧密地遵循Spring教程(https://spring.io/guides/gs/authenticating-ldap/)-

public void init(AuthenticationManagerBuilder auth) throws Exception {

        auth.ldapAuthentication()
        .userDnPatterns("sAMAccountName={0}")
        .contextSource().url(ldapURL)
            ;

}

我没有得到前面提到的绑定异常,但仍然无法进行身份验证。糟糕的凭据。

共有2个答案

鲜于阳
2023-03-14

您可以通过两种形式使用LDAP进行身份验证:

可以使用用户的完整DN(LDAP树中的完整路径)和密码进行绑定。

或者,您可以作为超级用户绑定到LDAP,可以搜索所有LDAP树。LDAP验证器查找用户DN,并将用户密码与用户条目中的密码进行比较。

在第一个代码中使用第二个系统。您需要一个可以在LDAP上绑定并找到用户条目的用户。

如果希望用户访问第二个系统,则必须提供用户条目的完整DN,而不仅仅是uid。

端木朝
2023-03-14

你需要分两步来完成:

  1. 作为管理用户绑定到LDAP,该用户具有足够的特权来搜索树,并通过您所拥有的关于他的任何唯一信息找到该用户。
  2. 使用提供的密码重新绑定到LDAP作为找到的用户的DN。
  3. 断开连接。

如果全部成功,用户名存在,密码正确。如果有任何失败,您应该将其视为日志记录失败。具体来说,您不应该告诉用户失败的原因是用户名未被找到还是密码不正确:这是对attacer的信息泄漏。

 类似资料:
  • 我需要连接到LDAP服务器,但出现以下错误: javax。命名。AuthenticationException:[LDAP:错误代码49-80090308:LDAPPER:DSID-0C09034,注释:AcceptSecurityContext错误,数据525,向量 用户名和密码正确,我尝试设置相同的用户并传入另一个用编写的应用程序。NET,它在那里工作,但在Java中,我收到了错误消息。 我的

  • 我使用Presto Cli测试ldap,下面是以下命令: 它不要求密码,我能够连接到Presto集群,并能够运行查询。为什么LDAP身份验证对此没有任何帮助?

  • 我有一个asp。net(C#)设置为使用LDAP进行身份验证。一切正常,我可以和我们目录中的任何用户一起登录。问题是,我需要将某些页面限制为特定组中的人。我正在使用登录查看帐户文件夹的方法。 我的网站设计很简单,它有三个页面,一个供所有人查看(账户文件夹之外),另外两个需要身份验证。我希望一个组可以访问两个网页,另一个组只能访问其中一个网页。 我试过: 但不管我的用户不在该组中。我有一个LDAP浏

  • 问题内容: 我试图让我的自定义Java应用程序使用我们的Active Directory服务器进行身份验证,但由于某种原因我无法使其正常工作。谁能看到为什么呢?这是我的方法如下: 结果: 问题答案: 你尝试过这种方式吗? 也更换 与

  • PS:我知道我可以使用一个额外的基于sAMAccountName的LDAP查询来获得用户的完整LDAP帐户,但是这将需要一个不必要的第二个LDAP查询,并且还需要将LDAP配置从Weblogic复制到我的应用程序中。

  • 我很难让LDAP安全配置与xml配置一起工作。