Bootstrap

Spring Security使用基本认证(Basic Auth)保护REST API

基本认证概述

基本认证(Basic Auth)是保护REST API最简单的方式之一。它通过在HTTP请求头中携带Base64编码过的用户名和密码来进行身份验证。由于基本认证不使用cookie,因此没有会话或用户登出的概念,这意味着每次请求都必须包含身份验证信息。

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.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;

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig {

    @Bean
    public static PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public 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);
    }
}

默认情况下,Spring Security同时启用了基于表单的身份验证和HTTP基本认证。上述配置中,我们通过调用httpBasic()方法仅启用了基本认证。此外,我们还定义了一个UserDetailsService实现,用于内存中的用户管理。

创建REST API

为了测试上面的Spring Security配置,创建一个简单的REST API并使用Spring Security加以保护。当向Spring Boot项目添加Spring Security依赖后,默认所有应用URL都会受到保护。

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) {
        return "Spring Security In-memory Authentication Example - Welcome " + authentication.getName();
    }
}

使用Postman测试REST API

要测试REST API,需要在请求头中传递Base64编码过的用户名和密码,即基本认证。
在这里插入图片描述

如果未提供这些凭证,将收到401状态码,这表明Spring Security正在正确地保护API。
在这里插入图片描述

总结

通过本教程,您应该了解了如何配置Spring Security的内置HTTP基本认证来保护REST API。

基本认证虽然简单,但在某些场景下仍是非常实用的选择。

;