基本认证概述
基本认证(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。
基本认证虽然简单,但在某些场景下仍是非常实用的选择。