Выбрать главу

Листинг 4.8 Thymeleaf структура формы регистрации

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml"

   xmlns:th="http://www.thymeleaf.org">

 <head>

   <title>Taco Cloud</title>

 </head>

 <body>

   <h1>Register</h1>

   <img th:src="@{/images/TacoCloud.png}"/>

  <form method="POST" th:action="@{/register}" id="registerForm">

     <label for="username">Username: </label>

     <input type="text" name="username"/><br/>

     <label for="password">Password: </label>

     <input type="password" name="password"/><br/>

     <label for="confirm">Confirm password: </label>

     <input type="password" name="confirm"/><br/>

     <label for="fullname">Full name: </label>

     <input type="text" name="fullname"/><br/>

     <label for="street">Street: </label>

     <input type="text" name="street"/><br/>

     <label for="city">City: </label>

     <input type="text" name="city"/><br/>

     <label for="state">State: </label>

     <input type="text" name="state"/><br/>

     <label for="zip">Zip: </label>

     <input type="text" name="zip"/><br/>

     <label for="phone">Phone: </label>

     <input type="text" name="phone"/><br/>

    <input type="submit" value="Register"/>

   </form>

 </body>

</html>

После отправки данных формы, запрос HTTP POST будет обработан методом processRegistration(). Объект RegistrationForm, передаваемый в processRegistration(), привязан к данным запроса и описывается следующим классом:

package tacos.security;

import org.springframework.security.crypto.password.PasswordEncoder;

import lombok.Data;

import tacos.User;

@Data

public class RegistrationForm {

 private String username;

 private String password;

 private String fullname;

 private String street;

 private String city;

 private String state;

 private String zip;

 private String phone;

 public User toUser(PasswordEncoder passwordEncoder) {

   return new User(

     username, passwordEncoder.encode(password),

     fullname, street, city, state, zip, phone);

 }

}

По большей части RegistrationForm - это простой класс с поддержкой Lombok и несколькими свойствами. Но метод toUser() использует эти свойства для создания нового пользовательского объекта, который будет сохранен с помощью внедренного UserRepository.

Вы, без сомнения, заметили, что RegistrationController внедряется с PasswordEncoder. Это точно тот же bean PasswordEncoder который вы объявили ранее. При обработке данных формы, RegistrationController передает ее методу toUser(), который использует ее для кодирования пароля перед сохранением в базу данных. Таким образом, отправленный пароль записывается в закодированном виде, и сервис сведений о пользователе сможет пройти проверку подлинности с использованием этого закодированного пароля.

Теперь приложение Taco Cloud имеет полную поддержку регистрации и аутентификации пользователей. Но если вы запустите его сейчас, вы заметите, что вы даже не можете попасть на страницу регистрации без запроса на вход. Потому что, по умолчанию, все запросы требуют проверки подлинности. Давайте посмотрим, как веб-запросы перехватываются и защищаются, чтобы вы могли исправить эту странную ситуацию с курицей и яйцом.

4.3 Защита веб-запросов

Требования безопасности для Taco Cloud должны требовать, чтобы пользователь аутентифицировался перед созданием тако или размещением заказов. Но домашняя страница, страница входа и страница регистрации должны быть доступны неавторизованным пользователям.

Чтобы настроить эти правила безопасности, позвольте мне представить вам другой метод configure() класса WebSecurityConfigurerAdapter:

@Override

protected void configure(HttpSecurity http) throws Exception {

...

}

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

-Требование соблюдения определенных условий безопасности перед обработкой запроса

-Настройка пользовательской страницы входа

-Возможность выхода пользователей из приложения

-Настройка защиты от подделки межсайтовых запросов

Перехват запросов, чтобы гарантировать, что у пользователя есть надлежащие полномочия, является одной из наиболее распространенных вещей, для которых вы настроите HttpSecurity.  Давайте сделаем, чтобы ваши клиенты Taco Cloud отвечали этим требованиям.

4.3.1 Защита запросов

Необходимо убедиться, что запросы /design и /orders доступны только авторизованным пользователям; все остальные запросы должны быть разрешены для всех пользователей. Следующая реализация configure() делает именно это:

@Override

protected void configure(HttpSecurity http) throws Exception {