При отправке данных с формы регистрации перенаправляет на вход

Рейтинг: 0Ответов: 1Опубликовано: 10.03.2023

Есть файл Freemarker с формой регистрации:

 <form class="form-container" action="/sign_up/register" method="post">
        <div class="form-group">
          <input type="tel" placeholder="Телефон" name="phone"  required>
        </div>
        <div class="form-group">
          <input type="email" placeholder="Почта"  name="email">
        </div>
        <div class="form-group">
          <input type="password" placeholder="Пароль" name="password"  required>
        </div>
        <div class="form-group">
          <input type="password" placeholder="Повтор пароля" name="confirmPassword"  required>
        </div>
        <button type="submit">Регистрация</button>
        <p>У вас уже есть аккаунт? <a href="sign_in">Вход</a></p>
    </form>

Есть файл конфигурации безопасности приложения Spring Security:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                    .antMatchers("/static/**", "/sign_up", "/sign_up/register", "/register").permitAll()
                    .antMatchers("/pending").hasRole(Role.PENDING.name())
                    .antMatchers("/parent/**").hasAnyRole(Role.PARENT.name(), Role.ADMIN.name())
                    .antMatchers("/tutor/**").hasAnyRole(Role.TUTOR.name(), Role.ADMIN.name())
                    .antMatchers("/**", "/dashboard").hasRole(Role.ADMIN.name())
                .and()
                    .formLogin()
                    .loginPage("/sign_in")
                    .permitAll()
                .and()
                    .logout()
                    .permitAll();
    }

Есть контроллер, который реагирует на страницу с формой регистрации:

package com.pine.KO.CAS.controller.users;

import com.pine.KO.CAS.controller.dto.RegistrationDTO;
import com.pine.KO.CAS.model.service.UserService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/sign_up")
//@SessionAttributes("registrationDTO")
public class SignUpController {

    private static final Logger logger = LogManager.getLogger(SignUpController.class);


    public SignUpController() {
        logger.error("SignUpController has been created!");
    }

    @GetMapping
    public String getSignUpPage(Model model) {
        logger.error("send to guest 'sign_up' page");
        model.addAttribute("registrationDTO", new RegistrationDTO());
        return "/auth/sign_up";
    }

//@ModelAttribute("registrationDTO") RegistrationDTO dto,
    @PostMapping("/register")
    public String redirectToRegisterPage(Model model) {
        logger.error("Redirecting to Register page");
        return "stub";
    }

}

GET метод отрабатывает - логи выводятся. Проблема в том, что при вводе любых данных в форму регистрации, при нажатии на кнопку submit данные должны передаваться в контроллер, в метод 'redirectToRegisterPage' и дальше должен происходить редирект на другой адрес, соответственно на другой контроллер.

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

Последнее моё предположение - какое-то недопонимание с адресами или возможно что-то неправильно сделал в Security конфиге.

P.S. Комментариями указывал что конкретно я пытался подправить, но ничего не менялось.

Ответы

▲ 0Принят

Проблемой являлась отсутствующая строчка скрытого поля в форме, которая передавала CSRF токен на сервер.

На натыкался на эту информацию в гайдах, потому что либо гайды с использованием шаблонизатора Thymeleaf, который умеет сам без явного указания пробрасывать токен на сервер, либо в конфигурации Security уже автоматически прописано отключение CSRF защиты (на что я не обращал внимания).

Именно поэтому срабатывал фильтр от CSRF атак, который перенаправлял меня обратно, потому что токен не передавался и попытка регистрации не засчитывалась.

Для отключения данного фильтра в конфиге Security необходимо в конце прописать строку

.csrf().disable();

Либо указать в форме с POST запросом следующее передаваемое поле:

<input type="hidden" name="_csrf" value=${_csrf.token}>

Далее идёт просто понос :D из потока мыслей...

Изначально я думал что перенаправляет обратно меня из-за того, что поля/данные сущности 'registrationDTO' не сопоставлялись с пробросом данных в другой контроллер, метод не находило и меня перенаправляло на ту же страницу, в связи с отсутствующим методом обработки данной сущности.

Изначально у меня, в методе 'redirectToRegisterPage' стоял редирект на контроллер регистрации 'return "redirect:/register";' Я думал не в том направлении.