2015-05-29 2 views
3

Привет Я пытаюсь реализовать аутентификацию 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();  
    } 

} 

Спасибо.

+0

При использовании аутентификации LDAP существует два режима. Сначала вы знаете, как создать DN пользователя на основе его имени пользователя (он может даже быть самим DN). Во-вторых, вам нужно выполнить поиск LDAP, чтобы найти DN пользователя. Для последнего вам необходимо иметь технический логин, чтобы компоненты аутентификации LDAP могли найти запись пользователя. И это то, что вы должны использовать, судя по вашему примеру. Вы должны попросить администраторов LDAP создать техническую учетную запись для вашего приложения и использовать ее в вашем 'LdapContextSource'. –

+0

Я знаю, что userDN всегда будет тем, что пользователь помещает в поле имени пользователя + @ pop.corp.local. Сначала я понял, что auth знал контекст и имел имя пользователя внутри него, но это не кажется правдой, поэтому я должен создать новый контекст. Я просто не знаю, как получить учетные данные оттуда. –

+0

Это не DN, это имя входа в домен. Но, возможно, вы можете войти в систему с Active Directory. Я не уверен. –

ответ

2

Я, наконец, понял это из сообщения this. Я до сих пор не знаю, как установить групповые фильтры, но по крайней мере теперь я могу привязываться к серверу.

@Bean 
public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 
    ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("pop.corp.local", 
      "ldap://tcp-prd.pop.corp.local:389"); 
     provider.setConvertSubErrorCodesToExceptions(true); 
     provider.setUseAuthenticationRequestCredentials(true); 
     return provider; 
} 

@Bean 
public LoggerListener loggerListener() { 
    return new LoggerListener(); 
} 


@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()); 
} 

    @Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
      .antMatchers("/resources/**").permitAll() 
      .anyRequest().authenticated() 
      .and() 
     .formLogin() 
      .loginPage("/login") 
      .permitAll();  
} 

EDIT: Я наконец выяснил, как фильтровать группы. Оказывается, они добавили метод setSearchFilter() в класс ActiveDirectoryLdapAuthenticationProvider v3.2.6. Поскольку я использую более старую версию, я никогда не знал об этом. Поэтому я сделал копию класса с помощью метода и только что создал метод buildFilter для создания строки фильтра, которая передается в setSearchFilter.