原文链接: Spring Security In-Memory Authentication – 原文作者: Ramesh Fadatare

本文选用的是意译的办法

在这篇 Spring Security 教程中,咱们将学习怎样装备 Spring Security,以完成在内存认证的功用。

概览

Spring Security 中的 InMemoryUserDetailsManager 完成了 UserDetailsService,以供给存储在内存中的根据用户名/暗码的身份验证。InMemoryUserDetailsManager 经过完成 UserDetailsManager 接口供给对 UserDetails 的办理功用。当 Spring Security 被装备为承受用户名和暗码进行身份验证时,将运用根据 UserDetails 的身份验证。

译者加:当然,咱们能够经过重写 usernamepassword 的办法更改验证的字段。比如将 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();
}

在下面的 InMemoryUserDetailsManagerJava 装备中,咱们创立了两个用户而且将其存放在 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 SecurityInMemoryUserDetailsManager 经过完成 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 内存中认证

总结

在这个教程中,咱们学到了怎样装备 Spring Security 6 以在内存中认证。一言蔽之,咱们运用了 Spring SecurityInMemoryUserDetailsManager 类,该类完成了 UserDetailsService,以供给在内存中存储用户名/暗码的身份认证支撑。