2015-09-24 5 views
3

У меня есть следующий код со мной Я пытаюсь достичь аутентификации ldap, но я думаю, что этого не происходит.Как достичь аутентификации Ldap с использованием весенней безопасности (весенний ботинок)

Мои настройки безопасности

@EnableWebSecurity 
@Configuration 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
public class Config extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http.httpBasic().and().authorizeRequests().antMatchers("/*") 
       .permitAll().anyRequest().authenticated().and().csrf() 
       .disable().httpBasic().and().csrf() 
       .csrfTokenRepository(csrfTokenRepository()).and() 
       .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class); 

    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) 
      throws Exception { 
     auth.ldapAuthentication() 
       .userSearchFilter("(uid={0})") 
       .userSearchBase("dc=intern,dc=xyz,dc=com") 
       .contextSource() 
       .url("ldap://192.168.11.11:1234/dc=intern,dc=xyz,dc=com") 
       .managerDn("username") 
       .managerPassword("password!") 
       .and() 
       .groupSearchFilter("(&(objectClass=user)(sAMAccountName=" + "username" + "))"); 

    } 

    private Filter csrfHeaderFilter() { 
     return new OncePerRequestFilter() { 
      @Override 
      protected void doFilterInternal(HttpServletRequest request, 
        HttpServletResponse response, FilterChain filterChain) 
        throws ServletException, IOException { 
       CsrfToken csrf = (CsrfToken) request 
         .getAttribute(CsrfToken.class.getName()); 
       if (csrf != null) { 
        Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); 
        String token = csrf.getToken(); 
        if (cookie == null || token != null 
          && !token.equals(cookie.getValue())) { 
         cookie = new Cookie("XSRF-TOKEN", token); 
         cookie.setPath("/"); 
         response.addCookie(cookie); 
         response.sendRedirect("/notAllowed"); 
        } 
       } 
       filterChain.doFilter(request, response); 
      } 
     }; 
    } 

    private CsrfTokenRepository csrfTokenRepository() { 
     HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
     repository.setHeaderName("X-XSRF-TOKEN"); 
     return repository; 
    } 
} 

Мой контроллер

@RequestMapping(value = { "/test" }, method = RequestMethod.GET) 
public @ResponseBody String retrieve() { 
    System.out.println("line 1"); 
    System.out.println("line 2"); 
    return "hello"; 

} 

@RequestMapping(value = { "/notAllowed" }, method = RequestMethod.GET) 
public @ResponseBody HttpStatus login() { 

    return HttpStatus.FORBIDDEN; 

} 

я стремлюсь:

я хочу добиться аутентификации LDAP. U имя пользователя и пароль будут получены от браузера, хотя я пробовал и с жестко запрограммированным именем пользователя и паролем.

если пользователь является подлинным то фильтр будет проверять санкционирование проверки маркера.

если это первый запрос затем новый маркер будет сгенерирован и послал. , если его не найден затем он отправит HTTP-статус запрещен.

У меня есть следующие проблемы:

  1. , когда я запускаю первый раз из браузера возвращается запрещено, но он также печатает «линия 1 и линия 2» в консоли, хотя это не возвращает привет, но запрещено.

  2. Мое htpSecurity и ldap Конфигурация отлично ?.

  3. от 2-го запроса всегда возвращают привет, я попытался открыть новую вкладку, новый запрос, но до сих пор она работает нормально .Если я перезапустить сервер только тогда он генерирует маркер и сравнить его с печеньем token.what если два человека используют одну и ту же систему (разное время).

  4. как именно я могу проверить аутентификацию ldap? Я использую POSTMAN в качестве клиента.

Если какая-либо информация отсутствует в моем конце, пожалуйста, дайте мне знать. И я буду благодарен за ваши ответы.

+0

у вас все еще есть проблемы? Если бы мой ответ не помог, пожалуйста, дайте мне знать. –

ответ

6

Прежде всего, я думаю, что ваша конфигурация HttpSecurity неверна. Вы хотите защитить ВСЕ конечные точки. Не так ли?

Меняем его на следующее:

http.httpBasic() 
     .and() 
     .authorizeRequests() 
     .anyRequest() 
     .authenticated() 
     .and() 
     .csrf() 
     .csrfTokenRepository(csrfTokenRepository()) 
     .and() 
     .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class); 

Кроме того, я не уверен, является ли ваш LDAP конфигурации является правильным.Я думаю, вы можете уменьшить его следующим образом:

auth.ldapAuthentication() 
     .userSearchFilter("uid={0}") 
     .contextSource() 
     .url("ldap://192.168.11.11:1234/dc=intern,dc=xyz,dc=com"); 

Убедитесь, что ваш userSearchBase прав. У него нет «ou».

Если у вас нет каких-либо различных организационных единиц, вы можете просто удалить userSearchBase

Чтобы обеспечить лучшую помощь, мне нужно знать структуру вашего LDAP.

Если вы хотите проверить ваш HttpSecurity конфиг вы не можете использовать LDAP в первую очередь и использовать inMemoryAuthentication вместо:

auth.inMemoryAuthentication().withUser("user").password("password").authorities("ROLE_USER"); 
+0

Привет, Яннич. Не могли бы вы помочь с помощью ниже ldap config. Как следует auth.ldapAuthentication следует искать этот ldap_user_search_base = OU = People, DC = Упр, DC = ABCD, DC = чистая ldap_group_search_base = OU = групп, DC = Упр, DC = ABCD, DC = чистая ldap_default_bind_dn = UID = прокси, НУ = Специальные пользователи, dc = Упр, dc = ABCD, DC = чистая ldap_default_authtok_type = пароль ldap_default_authtok = thisisthepassword ldap_group_member = memberUid –

+0

Пожалуйста, создайте вопрос о StackOverflow и связать его со мной. Я посмотрю на это. –

+0

Я получил это, спасибо! –

Смежные вопросы