Обеспечьте безопасность своего приложения Spring, используя надежные функции, предлагаемые средой Spring Security.

Платформа Spring Security защищает ваше приложение посредством аутентификации и авторизации. В состоянии по умолчанию Spring Security гарантирует, что для каждого пути HTTP-запроса (или страницы) в вашем приложении требуется аутентификация одного глобального пользователя.

Эта структура также очень гибкая. Это позволяет вам создавать настраиваемые правила безопасности для каждого пути HTTP-запроса в вашем приложении, а также для разных пользователей. Таким образом, вы можете снять ограничение безопасности на страницах, не требующих авторизации пользователя (например, домашней странице). И установить роли и полномочия конкретных типов пользователей.

Добавление Spring Security в ваше приложение

Есть два способа добавить Spring Security в ваше приложение. Вы можете выбрать его как зависимость при создании нового приложения Spring Boot. используя инициализацию Springили добавьте его в файл спецификации сборки в разделе зависимостей после создания проекта.

instagram viewer

Если вы выбрали один из вариантов проекта Gradle, то файл зависимостей build.gradle. Однако, если вы выбрали Maven, то этот файл пом.xml.

Твой build.gradle файл должен содержать следующую зависимость:

dependencies {
implementation 'org.springframework.boot: spring-boot-starter-security'
}

В то время как ваш пom.xml файл должен содержать следующую зависимость:


org.springframework.boot
spring-boot-starter-security

Образец приложения, использованный в статье, доступен в этом Репозиторий GitHub и вы можете использовать его бесплатно по лицензии MIT.

Использование весенней безопасности

Как только вы добавите зависимость Spring Security в свое приложение, вы сможете сразу начать использовать фреймворк. Просто запустите свое приложение, затем перейдите на домашнюю страницу Spring Boot (или на любую страницу вашего приложения). В примере приложения используется следующий начальный контроллер для управления настройками Spring Boot по умолчанию. локальный: 8080 запрос:

package com.springSecurityDemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
publicclassWebController{

@GetMapping("/")
public String home(){
return"Welcome!";
}
}

Выполнение вашего приложения после добавления одного класса контроллера выше создает следующее начальное представление:

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

Using generated security password: c4070465-4c65-4e72-8c3f-3800e631ba81

Каждый раз, когда вы перезапускаете приложение, автоматически сгенерированный пароль будет меняться, но имя пользователя останется прежним. Ввод имени пользователя и пароля по умолчанию направит вас к соответствующему представлению в вашем приложении.

Настройка безопасности Spring

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

  • Спринг-данные JPA
  • Драйвер MySQL JDBC
  • Лист тимьяна
  • Ломбок

Фреймворк Thymeleaf будет генерировать разные представления. Lombok поможет сократить код в ваших классах объектов. Библиотека JPA и драйвер MySQL позволят вам использовать базу данных MySQL с приложением, но у вас есть возможность использовать любую базу данных, которая вам удобна. Использование базы данных означает настройку приложения.свойства файл в файле ресурсов.

spring.datasource.url=jdbc: mysql://${MYSQL_HOST: localhost}:3306/spring_security
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update

Приведенный выше код конфигурации позволяет вам подключиться к локальной базе данных MySQL с именем spring_security, с именем пользователя корень, и пароль (1234). Вам нужно будет обновить эти данные, чтобы они соответствовали имени вашей базы данных и учетным данным.

После добавления дополнительных зависимостей и создания базы данных вы можете начать решать, сколько представлений будет иметь ваше приложение. Вам также необходимо знать, как выглядит безопасность каждой страницы. Наш пример приложения имеет 6 представлений:

  • Домашняя страница
  • Страница регистрации
  • Страница авторизации
  • Страница выхода
  • Страница пользователя
  • Страница ошибки

Единственное представление, которое потребует авторизации пользователя, — это страница пользователя. Эта страница доступна только для пользователей, которые сначала зарегистрируются, а затем войдут в приложение. В дополнение к стандартному пакету Spring Boot вам потребуется создать еще четыре пакета в своем приложении.

Класс контроллера регистрации

Пакет контроллера будет содержать классы, обрабатывающие HTTP-запросы. В зависимости от функции страницы вы обычно можете сгруппировать каждый HTTP-запрос в один класс контроллера, как в случае с Веб-контроллер сорт. Однако представление регистрации имеет больше уникальных функций, поэтому оно может иметь приватный класс контроллера:

@Controller
@RequestMapping("/register")
publicclassRegistrationController{
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;

publicRegistrationController( UserRepository userRepo, PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return"registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return"redirect:/login";
}
}

РегистрацияКонтроллер class является шлюзом к аспекту безопасности вашего приложения. @RequestMapping аннотация указывает тип запроса, который будет обрабатывать этот контроллер (запросы к локальный: 8080/регистр).

@GetMapping аннотация просто указывает, что если приложение получает запрос на /register, форма регистрации() метод должен обработать этот запрос, возвращая представление регистрации.

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

Создание новых конфигураций безопасности

Начиная с Spring 3.1 разработчики теперь могут создавать конфигурации для Spring Security с помощью Java, что означает классы вместо XML. Главное, что требуют эти классы конфигурации, это @Конфигурация аннотация.

@Configuration
publicclassSecurityConfiguration{
}

@Конфигурация аннотация указывает, что приведенный выше класс является классом конфигурации. Эти классы предоставляют bean-компоненты для Контекст весеннего приложения, который представляет собой контейнер, который Spring использует для создания и управления различными компонентами (или bean-компонентами) приложения. Первая фасоль в Конфигурация безопасности класс это парольЭнкодер боб.

@Bean
public PasswordEncoder passwordEncoder(){
 returnnew BCryptPasswordEncoder();
}

РегистрацияКонтроллер класс использует парольЭнкодер bean для кодирования новых паролей перед их сохранением в базе данных. Еще один важный компонент, который вам нужно добавить в Конфигурация безопасности класс это userDetailsService боб.

@Bean
public UserDetailsService userDetailsService(UserRepository userRepo){
 return username -> {
Customer customer = userRepo.findByUsername(username);
if (customer != null)
return customer;
thrownew UsernameNotFoundException("Customer '" + username + "' not found");
 };
}

userDetailsService боб нанимает Весенняя безопасностьUserDetailsService интерфейс для получения имени пользователя и пароля для аутентификации во время сеанса входа клиента. Таким образом, как только клиент нажимает кнопку входа в систему, userDetailsService боб приходит в движение.

Сквозь Пользовательский репозиторий, userDetailsService bean получает доступ ко всем существующим клиентам в базе данных. Затем этот интерфейс использует Пользовательский репозиторий чтобы найти пользователя с совпадающим именем пользователя и паролем, а затем возвращает все атрибуты этого клиента в виде объекта.

Если возвращаемый объект является клиентом, то этот клиент получает доступ к приложению. В противном случае страница автоматически обновится, позволяя пользователю ввести действительные учетные данные.

Цепочка фильтров

Весенняя безопасностьSecurityFilterChain интерфейс полезный интерфейс прикладного программирования (API) который играет важную роль в конфигурации Spring Security. Этот интерфейс работает с Весенняя безопасностьHttpSecurity класс для создания цепочки фильтров для определенных HTTP-запросов.

@Bean
public SecurityFilterChain filterChain(HttpSecurity http)throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/user").hasAuthority("USER").anyRequest().permitAll())
.formLogin(formLogin -> formLogin
.loginPage("/login").defaultSuccessUrl("/user", true))
.logout(logout -> logout.logoutSuccessUrl("/logout"));
 return http.build();
}

фильтрЦепь bean выше использует SecurityFilterChain API для выполнения нескольких задач. Во-первых, он использует HttpSecurity класс, чтобы указать, что только пользователи, которые имеют роль ПОЛЬЗОВАТЕЛЯ, могут получить доступ локальный хост: 8080/пользователь. И эту роль пользователь получает после регистрации, благодаря получить полномочия () метод, который реализует каждый новый объект клиента.

@Override
public Collection extends="extends" grantedauthority="grantedauthority"?> getAuthorities() {
 return Arrays.asList(new SimpleGrantedAuthority("USER"));
}

Цепочка фильтров разрешает неавторизованный доступ ко всем другим URL-адресам в приложении. фильтрЦепь bean также использует формаЛогин() и выйти() методы HttpSecurity объект класса.

Эти методы позволяют автоматически направлять пользователя на определенные страницы после выполнения задачи. Таким образом, пользователь, который вводит правильные учетные данные и нажимает кнопку входа на /login страница будет автоматически направлена ​​на /user страница.

Наконец, фильтрЦепь bean-компонент создает и возвращает цепочку фильтров, которая позволяет авторизованным пользователям получать доступ к приложению. Все три боба в Конфигурация безопасности класс работать вместе, чтобы защитить ваше приложение.

Однако фильтрЦепь bean играет более важную роль, диктуя уровень авторизации для каждый HTTP-запрос. Когда вы начнете добавлять больше страниц в свое приложение, вы можете использовать фильтрЦепь bean, чтобы установить их уровень безопасности.

Основное преимущество Spring Security

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