Я пытаюсь настроить 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.
Я пробовал некоторые вещи без каких-либо успехов. Любая подсказка о том, что происходит, будет высоко оценена.
Спасибо.
К сожалению, это не решило проблему. У меня есть ERR_TOO_MANY_REDIRECTS при попытке получить доступ к любому URL-адресу приложения. –