Повторное изучение SpringBoot3 — интеграция Spring Security (1)
Повторное изучение SpringBoot3 — интеграция Spring Security (1)

Spring Security — это мощная и гибкая платформа безопасности, широко используемая для защиты Java-приложений. С выпуском Spring Boot 3 и Java 17 Spring Security продолжает расширять свою функциональность, предоставляя разработчикам более оптимизированную настройку и современные методы обеспечения безопасности.

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

1. Введение и концепции

Spring Security предоставляет модель безопасности, основанную на аутентификации и авторизации. Аутентификация — это процесс проверки личности пользователя, а авторизация определяет, имеет ли пользователь разрешение на доступ к ресурсам.

Основные компоненты:

  • SecurityFilterChain:Ответственный за определение HTTP Запрос из цепочки фильтров безопасности.
  • UserDetailsService:Используется для загрузки информации о пользователе.,Обеспечьте аутентификацию.
  • PasswordEncoder:Обработка паролей пользователейизшифрованиеи расшифровка。

2. Базовая конфигурация

Spring Boot 3 использует автоматическую настройку для упрощения интеграции Spring Security. Но во многих реальных сценариях нам необходимо настроить конфигурацию безопасности. Основные этапы настройки Spring Security представлены ниже.

2.1. Добавьте зависимости.

Во-первых, в pom.xml Добавить Spring Security полагаться:

Язык кода:javascript
копировать
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
image-20241013135714903
image-20241013135714903

Затем в application.yml Настройте параметры безопасности в .

2.1 Базовая конфигурация аутентификации и авторизации

Сначала мы создаем SecurityConfig класс для настройки Spring Security конфигурация. Этот класс конфигурации обычно должен реализовать SecurityFilterChain,Spring Security Обрабатывается цепочкой фильтров HTTP просить. Цепочка фильтров состоит из серии фильтров. (Filter) В совокупности эти фильтры обрабатывают запросы последовательно в заданном порядке. Каждый фильтр выполняет определенную проверку безопасности или операцию (например, аутентификацию, авторизацию, управление сеансом и т. д.), а затем передает запрос следующему фильтру.

securityfilterchain
securityfilterchain

Пример кода

Язык кода:javascript
копировать
package com.coderjia.boot313security.config;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

/**
 * @author CoderJia
 * @create 2024/10/13 полдень 01:57
 * @Description
 **/
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/").permitAll()  // публичный доступ
                        .anyRequest().authenticated()  // Другие интерфейсы требуют сертификации
                )
                .formLogin(Customizer.withDefaults())
                .httpBasic(Customizer.withDefaults());  // использовать HTTP Basic Сертификация
        return http.build();
    }


    @Bean
    public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
        // Создать пользователя
        UserDetails user = User.builder()
                .username("coderjia")
                .password(passwordEncoder.encode("cj123456"))
                .roles("USER")
                .build();

        return new InMemoryUserDetailsManager(user);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();  // использовать BCrypt Сделать шифрование пароля
    }
}

объяснять

  1. SecurityFilterChain определяет все HTTP проситьизполитика безопасности。существоватьздесь,/ Пути общедоступны для всех, тогда как другие пути требуют аутентификации пользователя.
  2. UserDetailsService Предоставляются данные пользователя, включая имя пользователя, пароль и роль. существования В этом примере мы создаем пользователя с именем "user" изuser, пароль «пароль» (обработанный шифрованием) и присвоенный "USER" Если роль не Конфигурация, система выведет в журнал имя существования. user из Переписка пользователяизпароль:Using generated security password: b9fe7857-97a3-4db7-9602-9e10db56496d
  3. PasswordEncoder проходить BCryptPasswordEncoder Внедрите шифрование паролей, чтобы обеспечить безопасность паролей пользователей при хранении.
  4. @EnableWebSecurity注解启动 Spring Security из Автоматическая конфигурация, позволяющая автоматически интегрировать приложения Spring Security Обеспечивает функции безопасности.

3. Шифрование пароля

Spring Security Настоятельно рекомендуется использовать алгоритмы шифрования для шифрования паролей, чтобы предотвратить утечку конфиденциальной информации. существовать Spring Boot 3 середина,BCryptPasswordEncoder Это широко используемый метод шифрования. это основано на bcrypt алгоритм, обеспечивающий достаточную прочность и безопасность.

3.1. Как шифровать пароли пользователей

  • существовать UserDetailsService середина,наспроходить passwordEncoder.encode("password") шифрование на пароле пользователя.
  • существуют аутентификация, Spring Security Будет автоматическииспользоватьтакой жеизшифрование算法进行пароль比对。

3.2. Пользовательский шифратор паролей.

Если вам нужно настроить алгоритм шифрования пароля, вы можете его реализовать. PasswordEncoder интерфейс. Вот простой пример пользовательского шифрования:

Язык кода:javascript
копировать
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder(10);  // Установить интенсивность шифрования
}

В этом примере мы BCryptPasswordEncoder приведены параметры интенсивности шифрования,Чем больше значение,Чем выше безопасность,ношифрование Скорость будет относительно низкой。BCryptPasswordEncoder Реализация использования по умолчанию BCryptPasswordEncoder из Javadoc Упоминается, что сила из равна 10.

Язык кода:javascript
копировать
// Create an encoder with strength 16
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(16);
String result = encoder.encode("myPassword");
System.out.println(encoder.matches("password", result));

Или используйте SpringBoot CLI для шифрования пароля:

Язык кода:javascript
копировать
$ spring encodepassword password
SpringBoot CLI шифрование
SpringBoot CLI шифрование

4. Форма входа и персонализированная страница входа.

Кроме Basic Аутентификация, Весна Security Также поддерживается форма входа в систему. проходить formLogin() метод,Форма Сертификация может быть включена,Также доступна настройкаиз Авторизоватьсястраница。

Язык кода:javascript
копировать
        http
                .formLogin(Customizer.withDefaults() // использоватьпо умолчанию Авторизоваться
по умолчанию Авторизоватьсяинтерфейс
по умолчанию Авторизоватьсяинтерфейс

4.1. Индивидуальная форма входа в систему.

Язык кода:javascript
копировать
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
  			.requestMatchers("/").permitAll()  // публичный доступ
            .anyRequest().authenticated()
        )
        .formLogin(form -> form
            .loginPage("/login")  // Настроить страницу «Авторизоваться»
            .permitAll()  // Авторизоватьсястраница Незачем Сертификация
        )
        .logout(logout -> logout.permitAll());  // позволять Выйти    return http.build();
}

Здесь мы настроили страницу входа /login,并позволять用户访问Авторизоваться Функция而Незачем Сертификация,Предоставить интерфейс /index возвращаться index.html страница:

Язык кода:javascript
копировать
    @GetMapping("/login")
    public String login() {
        return "login";  // возвращатьсяназванный "login" из шаблона или HTML страница
    }

4.2. Определить контроллер

Язык кода:javascript
копировать
package com.coderjia.boot313security.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author CoderJia
 * @create 2024/10/13 полдень 02:10
 * @Description
 **/
@Slf4j
@Controller
public class LoginController {

    @GetMapping("/login")
    public String login() {
        return "login";  // возвращатьсяназванный "login" из шаблона или HTML страница
    }


    @GetMapping("/index")
    public String home() {
        log.info("index");
        return "index";  // возвращатьсяназванный "index" из шаблона или HTML страница
    }

    @ResponseBody
    @GetMapping("/admin")
    public String admin() {
        log.info("admin");
        return «Добро пожаловать на страницу управления»;
    }
}

4.3. Индивидуальный интерфейс входа.

Предоставьте простойизпервая страницастраницаи Авторизоваться Страница,здесьиспользовать Понятно thymeleaf Шаблон,Подробную информацию см.Переизучите SpringBoot3-интегрируйте Thymeleaf

Язык кода:javascript
копировать
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Main Page</title>
</head>
<body>
<h2>Welcome to my page</span>!</h2>
<a th:href="@{/admin}">Доступ к ограниченным ресурсам</a>
<br/>
<a th:href="@{/logout}">Logout</a>
</body>
</html>
Язык кода:javascript
копировать
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org">
	<head>
		<title>Please Log In</title>
	</head>
	<body>
		<h1>Please Log In</h1>
		<div th:if="${param.error}">
			Invalid username and password.</div>
		<div th:if="${param.logout}">
			You have been logged out.</div>
		<form th:action="@{/login}" method="post">
			<div>
			<input type="text" name="username" placeholder="Username"/>
			</div>
			<div>
			<input type="password" name="password" placeholder="Password"/>
			</div>
			<input type="submit" value="Log in" />
		</form>
	</body>
</html>

4.4. Тестовый вход.

Войдите на домашнюю страницу, вход в систему на данный момент не требуется!

первая страница
первая страница

Нажмите Доступ к ограниченным ресурсам /admin Требовать Сертификация,Перейдите на нашу персонализированную страницу из Авторизоваться.

Настроить страницу «Авторизоваться»
Настроить страницу «Авторизоваться»

После входа в настройки и логина и пароля,Сертификацияпроходить,Входить /admin страница:

Сертификацияпроходить
Сертификацияпроходить

5. Выход из системы

Есть вход в систему, а также выход из системы. По умолчанию Spring. Security создаст /logout конечная точка, поэтому дополнительный код не требуется. когда вы включаете spring-boot-starter-security полагаться или использовать @EnableWebSecurity При аннотации Spring Security Добавим поддержку выхода из системы и ответим по умолчанию. GET /logout и POST /logout

Обратите внимание, что весна Security Защита включена по умолчанию CSRF Атака, необходимая при выходе из системы csrf_token,позвони напрямую GET /logout подскажет 404, можно пройти только POST просить,

Язык кода:javascript
копировать
<form th:action="@{/logout}" method="post">
    <button type="submit">Logout</button>
</form>

Если обязательно использовать GET просить, вам необходимо изменить его на следующий вид Конфигурация:

Язык кода:javascript
копировать
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .csrf(Customizer.withDefaults())
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers("/").permitAll()  // публичный доступ
                        .anyRequest().authenticated()  // Другие интерфейсы требуют сертификации
                )
                .formLogin(form -> form
                        .loginPage("/login")
                        .permitAll()
                )
                .logout((logout) -> logout
                        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                )
                .httpBasic(Customizer.withDefaults());  // использовать HTTP Basic Сертификация
        return http.build();
    }

6. Резюме

Spring Security содержит множество концепций,本节先简单介绍Понятно其Сертификация Функция、определяется пользователемипароль管理,Остальные функции будут представлены позже.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose