我正在尝试为我的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)
;
}
我没有得到前面提到的绑定异常,但仍然无法进行身份验证。糟糕的凭据。
您可以通过两种形式使用LDAP进行身份验证:
可以使用用户的完整DN(LDAP树中的完整路径)和密码进行绑定。
或者,您可以作为超级用户绑定到LDAP,可以搜索所有LDAP树。LDAP验证器查找用户DN,并将用户密码与用户条目中的密码进行比较。
在第一个代码中使用第二个系统。您需要一个可以在LDAP上绑定并找到用户条目的用户。
如果希望用户访问第二个系统,则必须提供用户条目的完整DN,而不仅仅是uid。
你需要分两步来完成:
如果全部成功,用户名存在,密码正确。如果有任何失败,您应该将其视为日志记录失败。具体来说,您不应该告诉用户失败的原因是用户名未被找到还是密码不正确:这是对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配置一起工作。