Когда вы входите в систему, вы перенаправляетесь обратно на страницу входа

#java #spring #spring-boot #spring-security

Вопрос:

Я только начал изучать весеннюю безопасность и столкнулся с одной проблемой. После ввода учетных данных в форме входа в систему пользователь перенаправляется обратно на страницу входа.

Вот конфигурация безопасности.java, которую я настроил:

 @Configuration
@EnableWebSecurity
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {

private final PasswordEncoder passwordEncoder;
private final UserDetailsService userDetailsService;

public SpringSecurityConfiguration(PasswordEncoder passwordEncoder,
                                   @Qualifier("userDetailsServiceImpl") UserDetailsService userDetailsService) {
    this.passwordEncoder = passwordEncoder;
    this.userDetailsService = userDetailsService;
}

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

    http.httpBasic().disable()
            .csrf().disable()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests().antMatchers("/registration").permitAll()
            .and()
            .authorizeRequests().anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .usernameParameter("login")
            .passwordParameter("password")
            .permitAll()
            .defaultSuccessUrl("/main")
            .and()
            .logout()
            .logoutSuccessUrl("/login")
    ;
}

@Override
protected void configure(AuthenticationManagerBuilder auth) {
    auth.authenticationProvider(daoAuthenticationProvider());
}

@Bean
protected DaoAuthenticationProvider daoAuthenticationProvider() {
    DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
    daoAuthenticationProvider.setPasswordEncoder(passwordEncoder);
    daoAuthenticationProvider.setUserDetailsService(userDetailsService);
    return daoAuthenticationProvider;
}
 

}

Я получаю этот ответ в браузере:

Это метод в контроллере, который возвращает форму входа в систему:

 @GetMapping("/login")
public String showLoginForm(Model model) {
    model.addAttribute("user",new LoginForm());
    return "login";
}
 

Форма для входа в систему:

  <!DOCTYPE html>
 <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
 <head>
     <meta charset="UTF-8">
     <title>Login</title>
 </head>
 <body>
 <form th:action="@{/login}" th:object="${user}" method="post">
      <div>
           <label>
              <input type="text" th:field="*{login}" placeholder="Login">
           </label>
      </div>
      <div>
           <label>
               <input type="text" th:field="*{password}" placeholder="Password">
           </label>
      </div>
           <button class="primary-button" type="submit">LOGIN</button>
           <a th:href="@{/registration}">Add new user</a>
 </form>
 </body>
 </html>
 

Комментарии:

1. Вы работаете без сохранения состояния, поэтому после проверки подлинности проверка подлинности является lsot (из-за отсутствия состояния), вы будете перенаправлены на /main , однако из-за необходимости проверки подлинности вы вернетесь на страницу входа. Вам либо нужна оценка с отслеживанием состояния , либо создайте токен после входа в систему и добавьте аутентификацию на основе токенов, чтобы следующий запрос отправил токен (требуется javascript или файлы cookie).