原文链接: Spring Security In-Memory Authentication - 原文作者: Ramesh Fadatare
本文采用的是意译的方式
在这篇 Spring Security
教程中,我们将学习如何配置 Spring Security
,以实现在内存认证的功能。
概览
Spring Security
中的 InMemoryUserDetailsManager
实现了 UserDetailsService
,以提供存储在内存中的基于用户名/密码的身份验证。InMemoryUserDetailsManager
通过实现 UserDetailsManager
接口提供对 UserDetails
的管理功能。当 Spring Security
被配置为接受用户名和密码进行身份验证时,将使用基于 UserDetails
的身份验证。
译者加:当然,我们可以通过重写
username
和password
的方法更改验证的字段。比如将username
返回值为
Maven
在 Spring Boot
项目中使用 Spring Security
,我们需要添加下面 Maven
依赖:
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Spring Security 配置
接下来,我们使用内存认证 的方式配置 Spring Security
。我们创建名为 SpringSecurityConfig
类,并添加下面代码👇
java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
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;
@Configuration
public class SpringSecurityConfig {
@Bean
public static PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeHttpRequests((authorize) -> {
authorize.anyRequest().authenticated();
}).httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean
public UserDetailsService userDetailsService(){
UserDetails ramesh = User.builder()
.username("ramesh")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(ramesh, admin);
}
}
在这里,我们使用了 httpBasic()
方法在 SecurityFilterChain bean
中定义了基本认证。
java
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeHttpRequests((authorize) -> {
authorize.anyRequest().authenticated();
}).httpBasic(Customizer.withDefaults());
return http.build();
}
在下面的 InMemoryUserDetailsManager
的 Java
配置中,我们创建了两个用户并且将其存放在 InMemoryUserDetailsManager
类对象中。
java
@Bean
public UserDetailsService userDetailsService(){
UserDetails ramesh = User.builder()
.username("ramesh")
.password(passwordEncoder().encode("password"))
.roles("USER")
.build();
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder().encode("admin"))
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(ramesh, admin);
}
Spring Security
的 InMemoryUserDetailsManager
通过实现 UserDetailsService
接口,提供了基于用户名/密码的身份验证支持,这些验证信息存放在内存中。
需要注意的是,我们使用 PasswordEncoder
来加密密码。Spring Security
中的 PasswordEncoder
接口被用来对密码进行单向转换,以确保密码安全地存储。我们使用的 BCryptPasswordEncoder
类实现了 PasswordEncoder
接口。
BCryptPasswordEncoder
类实现了 bcrypt
算法对密码进行哈希算法。
java
@Bean
public static PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
java
.password(passwordEncoder().encode("password"))
创建 REST API
为了验证上面的 Spring Security
配置,我们创建一个基于 Spring Security
的简单 REST API
。嗯,如果我们只是简单添加了 Spring Security
依赖到 Spring Boot
项目中,那么 Spring Security
会默认保护程序的所有 URLs
。
java
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WelComeController {
@GetMapping("/greeting")
public String greeting(Authentication authentication) {
String userName = authentication.getName();
return "Spring Security In-memory Authentication Example - Welcome " + userName;
}
}
使用 Postman 测试 REST API
为了测试 REST APIs
,我们在头信息 basic authentication
中输入用户名和密码。
截图中,我们输入了用户名/密码为 admin/admin
:
总结
在这个教程中,我们学到了怎么配置 Spring Security 6
以在内存中认证。一言蔽之,我们使用了 Spring Security
的 InMemoryUserDetailsManager
类,该类实现了 UserDetailsService
,以提供在内存中存储用户名/密码的身份认证支持。