2016-03-04 3 views
0

Я пытаюсь настроить Spring Security с помощью Java Config для обработки двух типов аутентификации в моем приложении: на основе формы (пользовательский логин) и на основе токенов (REST api).Несколько причин, связанных с безопасностью сети ERR_TOO_MANY_REDIRECTS

Конфигурация форма straighforward, за исключением той части, где я должен был создать свой собственный SecuritySocialConfigurer (в основном копию SpringSocialConfigurer с обработчиком успеха пользовательской аутентификации, который генерирует JWT маркер и устанавливает печенье с ним в ответ).

@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    super.configure(auth); 
    auth 
     .userDetailsService(userDetailsService()) 
     .passwordEncoder(NoOpPasswordEncoder.getInstance()); 
} 

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/css/**", "/img/**"); 
} 

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .formLogin() 
      .loginPage("/signin") 
      .loginProcessingUrl("/signin/authenticate") 
      .failureUrl("/signin?param.error=bad_credentials") 
     .and() 
      .logout() 
       .logoutUrl("/signout") 
       .deleteCookies("JSESSIONID") 
     .and() 
      .authorizeRequests() 
       .antMatchers("/admin/**", "favicon.ico", "/public/**", "/auth/**", "/signin/**").permitAll() 
       .antMatchers("/**").hasRole("USER") 
     .and() 
      .rememberMe() 
     .and() 
      .apply(new MilesSocialSecurityConfigurer()); 
} 

Когда только эта конфигурация находится в игре, я могу получить доступ к http://localhost:8080 и быть перенаправлены на http://localhost:8080/signin для выполнения входа в аккаунт. После успешного подписания я проверю наличие тонера cookie JWT.

Вторая конфигурация безопасности заключается в проверке наличия токена JWT при вызове REST api.

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http 
     .addFilterAfter(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) 
     .antMatcher("/api/**") 
      .csrf() 
       .disable() 
      .sessionManagement() 
       .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
     .and() 
      .exceptionHandling() 
       .authenticationEntryPoint(restAuthenticationEntryPoint) 
     .and() 
      .authorizeRequests() 
       .antMatchers("favicon.ico", "/public/**", "/auth/**", "/signin/**").permitAll() 
       .antMatchers("/**").authenticated() 
     ; 
} 

@Bean 
public JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception { 
    JwtAuthenticationFilter filter = new JwtAuthenticationFilter("/api/**"); 
    filter.setAuthenticationSuccessHandler(jwtAuthenticationSuccessHandler); 
    filter.setAuthenticationManager(apiAuthenticationManager()); 
    return filter; 
} 

@Bean 
public ProviderManager apiAuthenticationManager() { 
    return new ProviderManager(Arrays.asList(jwtAuthenticationProvider)); 
} 

JwtAuthenticationProvider это класс, который анализирует маркер JWT и генерирует UserDetails объект или выбрасывает AuthenticationException, если маркер не существует или является недействительным.

Когда эта вторая конфигурация установлена ​​на месте, я не могу перейти к http://localhost:8080 (или /signin), чтобы инициировать входной процесс - браузер возвращает ERR_TOO_MANY_REDIRECTS.

Я пробовал некоторые вещи без каких-либо успехов. Любая подсказка о том, что происходит, будет высоко оценена.

Спасибо.

ответ

0

Изменить

.antMatchers("/**").authenticated() 

в

.anyRequest().authenticated() 

Это означает, что любой URL, который не соответствует тому, что вы четко определены будет требовать аутентификации.

+0

К сожалению, это не решило проблему. У меня есть ERR_TOO_MANY_REDIRECTS при попытке получить доступ к любому URL-адресу приложения. –

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

  • Нет связанных вопросов^_^