Spring Security — это мощная и гибкая платформа безопасности, широко используемая для защиты Java-приложений. С выпуском Spring Boot 3 и Java 17 Spring Security продолжает расширять свою функциональность, предоставляя разработчикам более оптимизированную настройку и современные методы обеспечения безопасности.
В этой статье будет подробно описано, как интегрировать Spring Security в Spring Boot 3, включая основные функции, такие как базовая аутентификация и шифрование паролей.
Spring Security предоставляет модель безопасности, основанную на аутентификации и авторизации. Аутентификация — это процесс проверки личности пользователя, а авторизация определяет, имеет ли пользователь разрешение на доступ к ресурсам.
Основные компоненты:
Spring Boot 3 использует автоматическую настройку для упрощения интеграции Spring Security. Но во многих реальных сценариях нам необходимо настроить конфигурацию безопасности. Основные этапы настройки Spring Security представлены ниже.
Во-первых, в pom.xml
Добавить Spring Security полагаться:
<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>
Затем в application.yml
Настройте параметры безопасности в .
Сначала мы создаем SecurityConfig
класс для настройки Spring Security конфигурация. Этот класс конфигурации обычно должен реализовать SecurityFilterChain
,Spring Security Обрабатывается цепочкой фильтров HTTP просить. Цепочка фильтров состоит из серии фильтров. (Filter
) В совокупности эти фильтры обрабатывают запросы последовательно в заданном порядке. Каждый фильтр выполняет определенную проверку безопасности или операцию (например, аутентификацию, авторизацию, управление сеансом и т. д.), а затем передает запрос следующему фильтру.
Пример кода:
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 Сделать шифрование пароля
}
}
объяснять:
SecurityFilterChain
определяет все HTTP проситьизполитика безопасности。существоватьздесь,/
Пути общедоступны для всех, тогда как другие пути требуют аутентификации пользователя.UserDetailsService
Предоставляются данные пользователя, включая имя пользователя, пароль и роль. существования В этом примере мы создаем пользователя с именем "user" изuser, пароль «пароль» (обработанный шифрованием) и присвоенный "USER" Если роль не Конфигурация, система выведет в журнал имя существования. user из Переписка пользователяизпароль:Using generated security password: b9fe7857-97a3-4db7-9602-9e10db56496d
。PasswordEncoder
проходить BCryptPasswordEncoder
Внедрите шифрование паролей, чтобы обеспечить безопасность паролей пользователей при хранении.@EnableWebSecurity
注解启动 Spring Security из Автоматическая конфигурация, позволяющая автоматически интегрировать приложения Spring Security Обеспечивает функции безопасности.Spring Security Настоятельно рекомендуется использовать алгоритмы шифрования для шифрования паролей, чтобы предотвратить утечку конфиденциальной информации. существовать Spring Boot 3 середина,BCryptPasswordEncoder
Это широко используемый метод шифрования. это основано на bcrypt
алгоритм, обеспечивающий достаточную прочность и безопасность.
UserDetailsService
середина,наспроходить passwordEncoder.encode("password")
шифрование на пароле пользователя.Если вам нужно настроить алгоритм шифрования пароля, вы можете его реализовать. PasswordEncoder
интерфейс. Вот простой пример пользовательского шифрования:
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(10); // Установить интенсивность шифрования
}
В этом примере мы BCryptPasswordEncoder
приведены параметры интенсивности шифрования,Чем больше значение,Чем выше безопасность,ношифрование Скорость будет относительно низкой。BCryptPasswordEncoder
Реализация использования по умолчанию BCryptPasswordEncoder
из Javadoc Упоминается, что сила из равна 10.
// 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 для шифрования пароля:
$ spring encodepassword password
Кроме Basic Аутентификация, Весна Security Также поддерживается форма входа в систему. проходить formLogin()
метод,Форма Сертификация может быть включена,Также доступна настройкаиз Авторизоватьсястраница。
http
.formLogin(Customizer.withDefaults() // использоватьпо умолчанию Авторизоваться
@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 страница:
@GetMapping("/login")
public String login() {
return "login"; // возвращатьсяназванный "login" из шаблона или HTML страница
}
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 «Добро пожаловать на страницу управления»;
}
}
Предоставьте простойизпервая страницастраницаи Авторизоваться Страница,здесьиспользовать Понятно thymeleaf Шаблон,Подробную информацию см.Переизучите SpringBoot3-интегрируйте Thymeleaf:
<!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>
<!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>
Войдите на домашнюю страницу, вход в систему на данный момент не требуется!
Нажмите Доступ к ограниченным ресурсам /admin
Требовать Сертификация,Перейдите на нашу персонализированную страницу из Авторизоваться.
После входа в настройки и логина и пароля,Сертификацияпроходить,Входить /admin
страница:
Есть вход в систему, а также выход из системы. По умолчанию Spring. Security создаст /logout
конечная точка, поэтому дополнительный код не требуется. когда вы включаете spring-boot-starter-security
полагаться или использовать @EnableWebSecurity
При аннотации Spring Security Добавим поддержку выхода из системы и ответим по умолчанию. GET /logout
и POST /logout
。
Обратите внимание, что весна Security Защита включена по умолчанию CSRF
Атака, необходимая при выходе из системы csrf_token
,позвони напрямую GET /logout
подскажет 404, можно пройти только POST
просить,
<form th:action="@{/logout}" method="post">
<button type="submit">Logout</button>
</form>
Если обязательно использовать GET
просить, вам необходимо изменить его на следующий вид Конфигурация:
@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();
}
Spring Security содержит множество концепций,本节先简单介绍Понятно其Сертификация Функция、определяется пользователемипароль管理,Остальные функции будут представлены позже.