Spring Boot Security POST перенаправляет на страницу входа в систему после выполнения запроса на сохранение входа в систему - PullRequest
0 голосов
/ 23 июня 2019

Я сталкиваюсь с действительно раздражающей проблемой, и я не знаю, как прогрессировать в этом. Я вхожу в свое приложение, навигация работает хорошо, вход / выход работает хорошо. Но когда я хочу что-то сохранить, меня перенаправляют прямо на страницу входа. В логах исполняется только мой LoginController. Когда я снова вхожу в систему, мой запрос POST выполняется, данные сохраняются. Такое поведение у меня везде в приложении, я думаю, что это как-то проблема с конфигурацией в Spring Security. Любая помощь будет приветствоваться.

Конфигурация безопасности My Spring:

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    final FormLoginConfigurerEnhancer enhancer;
    final AuthenticationSuccessHandler authenticationSuccessHandler;

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

    @Override
    public void configure(HttpSecurity http) throws Exception {
        enhancer.addRecaptchaSupport(http.formLogin())
            .loginPage("/login")
                .successHandler(authenticationSuccessHandler)
                .and()
                .csrf().disable()
            .authorizeRequests()
                .antMatchers("/", "/login", "/home", "/registration").permitAll()
                .anyRequest().authenticated()
        ;
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth, UserDetailsService userDetailsService) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Кажется, когда я что-то сохраняю (публикую), в это время мой пользователь является анонимным. Это часть логов, когда я нажимаю кнопку сохранения:

2019-06-23 19: 14: 22.373 DEBUG 21576 --- [io-8080-exec-10] o.s.s.w.a.i.FilterSecurityInterceptor: Ранее аутентифицирован: org.springframework.security.authentication.AnonymousAuthenticationToken@bffd4aser: Полномочия: [ЗАЩИЩЕНО]; Аутентифицировано: правда; Подробности: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0: 0: 0: 0: 0: 0: 0: 1; SessionId: null; Предоставленные полномочия: ROLE_ANONYMOUS 2019-06-23 19: 14: 22.373 DEBUG 21576 --- [io-8080-exec-10] ossaccess.vote. : -1 2019-06-23 19: 14: 22.373 DEBUG 21576 --- [nio-8080-exec-6] o.s.s.w.a.ExceptionTranslationFilter: доступ запрещен (пользователь является анонимным); перенаправление на точку входа аутентификации

Я также обнаружил, что идентификатор сеанса запроса стал недействительным:

2019-06-23 19: 22: 29.874 DEBUG 21576 --- [nio-8080-exec-9] o.s.security.web.FilterChainProxy: / property / edit в позиции 9 из 11 в цепочке дополнительных фильтров; фильтр обжига: 'SessionManagementFilter' 2019-06-23 19: 22: 29.874 DEBUG 21576 --- [nio-8080-exec-9] o.s.s.w.session.SessionManagementFilter: запрашиваемый идентификатор сеанса 9FBCB80752CBCFC16D704D6C3BB62E05 недействителен.

Я использую последнюю версию Spring Boot 2.1.6.

1 Ответ

0 голосов
/ 23 июня 2019

Я нашел способ, как заставить мою проблему работать. Но это скорее обходной путь, не зная, почему он работает сейчас, но не раньше. Поэтому я напишу здесь ответ, как я его получил, но любые базовые знания или лучшие решения по-прежнему приветствуются.

Основная проблема заключалась в том, что когда я отправлял сообщение для сохранения чего-либо, я получал выход из Spring Security. Поэтому я играл с .logout в методе Spring Security.

Мой URL для выхода из системы должен выглядеть как /login?logout. Spring Boot каким-то образом имеет URL по умолчанию /logout. Но я должен установить logoutUrl вручную, чтобы мои функции сохранения работали. Так что теперь я определяю это как .logoutUrl("/login?logout"), тогда сохранение в порядке. (Когда я удаляю это и сохраняю что-то, я выхожу из системы!)

Таким образом, моя Spring Security теперь настроена следующим образом:

@Override
public void configure(HttpSecurity http) throws Exception {
    enhancer.addRecaptchaSupport(http.formLogin())
        .loginPage("/login")
            .successHandler(authenticationSuccessHandler)
            .and()
            .csrf().disable()
            .logout().logoutUrl("/login?logout")
            .and()
        .authorizeRequests()
            .antMatchers("/", "/login", "/home", "/registration").permitAll()
            .anyRequest().authenticated()
    ;
}

Я настроил Spring Security ТОЛЬКО для .logoutUrl("/login?logout"), чтобы мое приложение могло сохранять и не выходить из системы. Когда я хочу выйти из системы, меня перенаправляют на неправильный весенний URL по умолчанию /logout. Так что теперь я определил в своем LoginController метод для перенаправления на правильный URL.

@PostMapping("/logout")
public ModelAndView logout() {
    return new ModelAndView("redirect:/login?logout");
}

Это все ужасно и запутанно, но я действительно не знаю, что здесь происходит. Пожалуйста, положи свет во тьму. Большое вам спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...