Привет Я пытаюсь реализовать аутентификацию ldap с использованием класса WebSecurityConfigurerAdapter.Как реализовать аутентификацию Ldap Spring Security правильно с помощью класса конфигурации?
До сих пор я мог аутентифицироваться с помощью метода памяти и даже моего ldap-сервера моего корпуса, однако последний метод, который я могу выполнить только для проверки подлинности, если я передаю hardcoded userDN и пароль, когда создаю новый контекст, «т создать новый контекст, или я не поставил userDN и пароль, JVM бросает мне:
Caused by: 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\u0000]; Remaining name: '/'
Мой вопрос, как я могу получить пароль пользователя и userDN из формы входа в систему, так что я могу поставить его в контексте? Если это невозможно, как я могу получить контекст, который содержит пароль и userDn?
Это код, который у меня есть:
@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.ldapAuthentication().userSearchFilter("(&(objectClass=user)(sAMAccountName={0}))")
.groupSearchFilter("(&(memberOf:1.2.840.113556.1.4.1941:=CN=DL - DC859 - MIDDLEWARE,OU=Dyn,OU=Dist,OU=Security Groups,OU=POP,DC=pop,DC=corp,DC=local))")
.contextSource(getLdapContextSource());
}
private LdapContextSource getLdapContextSource() throws Exception {
LdapContextSource cs = new LdapContextSource();
cs.setUrl("ldap://tcp-prd.pop.corp.local:389");
cs.setBase("DC=pop,DC=corp,DC=local");
cs.setUserDn("[email protected]");
cs.setPassword("mypassword");
cs.afterPropertiesSet();
return cs;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
}
Спасибо.
При использовании аутентификации LDAP существует два режима. Сначала вы знаете, как создать DN пользователя на основе его имени пользователя (он может даже быть самим DN). Во-вторых, вам нужно выполнить поиск LDAP, чтобы найти DN пользователя. Для последнего вам необходимо иметь технический логин, чтобы компоненты аутентификации LDAP могли найти запись пользователя. И это то, что вы должны использовать, судя по вашему примеру. Вы должны попросить администраторов LDAP создать техническую учетную запись для вашего приложения и использовать ее в вашем 'LdapContextSource'. –
Я знаю, что userDN всегда будет тем, что пользователь помещает в поле имени пользователя + @ pop.corp.local. Сначала я понял, что auth знал контекст и имел имя пользователя внутри него, но это не кажется правдой, поэтому я должен создать новый контекст. Я просто не знаю, как получить учетные данные оттуда. –
Это не DN, это имя входа в домен. Но, возможно, вы можете войти в систему с Active Directory. Я не уверен. –