Spring Security内存中认证的实现
本文采用的是意译的方式
在这篇 Spring Security 教程中,我们将学习如何配置 Spring Security,以实现在内存认证的功能。
概览
Spring Security 中的 InMemoryUserDetailsManager 实现了 UserDetailsService,以提供存储在内存中的基于用户名/密码的身份验证。InMemoryUserDetailsManager 通过实现 UserDetailsManager 接口提供对 UserDetails 的管理功能。当 Spring Security 被配置为接受用户名和密码进行身份验证时,将使用基于 UserDetails 的身份验证。
译者加:当然,我们可以通过重写 username 和 password 的方法更改验证的字段。比如将 username 返回值为 email。
Maven
在 Spring Boot 项目中使用 Spring Security,我们需要添加下面 Maven 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>Spring Security 配置
接下来,我们使用内存认证的方式配置 Spring Security。我们创建名为 SpringSecurityConfig 类,并添加下面代码👇
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 中定义了基本认证。
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeHttpRequests((authorize) -> {
authorize.anyRequest().authenticated();
}).httpBasic(Customizer.withDefaults());
return http.build();
}在下面的 InMemoryUserDetailsManager 的 Java 配置中,我们创建了两个用户并且将其存放在 InMemoryUserDetailsManager 类对象中。
@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 算法对密码进行哈希算法。
@Bean
public static PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
.password(passwordEncoder().encode("password"))创建 REST API
为了验证上面的 Spring Security 配置,我们创建一个基于 Spring Security 的简单 REST API。嗯,如果我们只是简单添加了 Spring Security 依赖到 Spring Boot 项目中,那么 Spring Security 会默认保护程序的所有 URLs。
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,以提供在内存中存储用户名/密码的身份认证支持。
到此这篇关于Spring Security内存中认证的实现的文章就介绍到这了,更多相关Spring Security内存认证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
- SpringSecurity 默认登录认证的实现原理解析
- SpringSecurity实现权限认证与授权的使用示例
- SpringBoot整合SpringSecurity认证与授权
- SpringSecurity+jwt+redis基于数据库登录认证的实现
- SpringSecurity身份认证原理解析
- springsecurity第三方授权认证的项目实践
- Spring Security实现身份认证和授权的示例代码
- SpringSecurity实现前后端分离登录token认证详解
- Spring Security认证机制源码层探究
- SpringBoot security安全认证登录的实现方法
- Spring Security添加二次认证的项目实践
相关文章
Spring boot中@Conditional和spring boot的自动配置实例详解
本文通过实例给大家介绍了Spring boot中@Conditional和spring boot的自动配置,需要的朋友可以参考下2018-05-05
基于SpringBoot集成测试远程连接Redis服务的教程详解
这篇文章主要介绍了基于SpringBoot集成测试远程连接的Redis服务的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-03-03
Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆红的原因解读
这篇文章主要介绍了Springboot中com.mysql.cj.jdbc.Driver在yml文件中爆红的原因解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-05-05
一步步讲解Spring Boot整合MyBatis与PostgreSQL实战指南
这篇文章主要介绍了如何在SpringBoot环境中集成MyBatis和PostgreSQL,涵盖了环境搭建、项目创建、数据源配置、实体类与Mapper接口定义、MapperXML文件编写、业务层与控制层实现以及测试与验证的全过程,需要的朋友可以参考下2025-02-02
Spring定时任务中@PostConstruct被多次执行异常的分析与解决
这篇文章主要给大家介绍了关于Spring定时任务中@PostConstruct被多次执行异常的分析与解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2017-10-10


最新评论