Spring: действие кнопки «Ошибка» в форме после добавления регистрации (Spring Security) - PullRequest
1 голос
/ 01 июля 2019

Я делаю пример со страницей входа - Spring Security.

Коротко:

  1. Есть корневая страница ("localhost: 8080 /") - вот ссылка на главную страницу.
  2. Нажмите на ссылку на главной странице и перейдите на main.html (localhost: 8080 / main /
  3. Если пользователь не авторизуется, он перенаправляется на страницу входа
  4. При авторизации пользователя открывается главная страница
  5. На главной странице отображаются сообщения и фильтр по тегу
  6. Я ввожу тег в поле ввода и нажимаю кнопку Поиск (Найти), сообщения фильтруются по тегу

Когда я добавил авторизацию, фильтр прекратил работу.

Это мой исходный код:

корневая страница - есть ссылка на главную страницу

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Gretting start: Serving Web Content</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <div>Hello, user</div>
    <a th:href="@{/main}">Main page</a>
</body>
</html>

Главная страница

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <div>
        <form method="post">
            <input type="text" name="text" placeholder="Введите сообщение" />
            <input type="text" name="tag" placeholder="Тэг">
            <button type="submit">Добавить</button>     
        </form>
    </div>
    <div>Список сообщений</div>
    <form method="post" action="filter">
        <input type="text" name="filter">
        <button type="submit">Найти</button>
    </form>
    <div th:each = "message : ${messages}">
        <b th:text = "${message.id}"></b>
        <span th:text = "${message.text}"></span>
        <i th:text = "${message.tag}"></i>
    </div>
</body>
</html>

Контроллер обрабатывает все сопоставления

package com.example.sweater;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.sweater.domain.Message;
import com.example.sweater.repos.MessageRepo;

@Controller
public class GreetingController {

    @Autowired
    private MessageRepo messageRepo;

    @GetMapping("/")
    public String greeting(Model model) {

        return "greeting";

    }

    @GetMapping("/main")
    public String main(Model model) {

        Iterable<Message> messages = messageRepo.findAll();

        model.addAttribute("messages", messages);

        return "main";
    }

    @PostMapping("/main")
    public String add(@RequestParam String text, @RequestParam String tag, Model model) {

        Message message = new Message(text, tag);

        messageRepo.save(message);

        Iterable<Message> messages = messageRepo.findAll();

        model.addAttribute("messages", messages);

        return "main";
    }

    @PostMapping("/filter")
    public String filter(@RequestParam String filter, Model model) {

        Iterable<Message> messages;

        if (filter != null && !filter.isEmpty()) {
            messages = messageRepo.findByTag(filter);
        } else {
            messages = messageRepo.findAll();
        }

        model.addAttribute("messages", messages);

        return "main";

    }
}

WebSecurityConfig имеет одного пользователя в памяти. antMathcers ("/") allowAll и anyRequest аутентифицированы

package com.example.sweater.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
            .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
                .logout()
                .permitAll();
    }

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        UserDetails user =
             User.withDefaultPasswordEncoder()
                .username("u")
                .password("p")
                .roles("USER")
                .build();

        return new InMemoryUserDetailsManager(user);
    }
}

Мои скриншоты корневая страница

enter image description here

Главная страница

enter image description here

Когда я ввожу тег фильтра и нажимаю кнопку «Найти» (= Поиск), у меня появляется ошибка:

enter image description here

@PostMapping("/filter") не улавливает действие в форме. Я проверил в отладчике. Я не могу поймать ошибку и не знаю, почему это происходит.

У меня есть репозиторий GitHub: https://github.com/aalopatin/sweater

Подтвердить с комментарием "Добавить сообщения" - работа фильтра

Фиксировать с комментарием «Добавить удаленный репозиторий и Логин» - фильтр не работает и добавить логин

1 Ответ

0 голосов
/ 01 июля 2019

Я нашел решение.В форму на главной странице необходимо добавить атрибут 'th', потому что я использую Thymeleaf так шаблонизатор.Это необходимо для защиты _csrf, который автоматически вставляет токен в форму, если вы используете Thymeleaf:

<form method="post" th:action="filter">
   <input type="text" name="filter">
   <button type="submit">Найти</button>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...