使用Spring Boot与Spring Security构建安全的RESTful API
引言
在现代Web应用开发中,安全性是至关重要的。Spring Boot和Spring Security为开发者提供了一套强大的工具,用于构建安全的RESTful API。本文将详细介绍如何结合Spring Boot和Spring Security,并使用JWT(JSON Web Token)实现身份验证与授权。
技术栈
- 核心框架: Spring Boot, Spring Security
- 身份验证: JWT
- 数据库: H2 (用于演示)
- 构建工具: Maven
项目初始化
首先,使用Spring Initializr创建一个新的Spring Boot项目,添加以下依赖:
- Spring Web
- Spring Security
- H2 Database
- Lombok (可选)
配置Spring Security
Spring Security的核心是SecurityFilterChain。我们需要自定义一个配置类来覆盖默认的安全行为。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
)
.sessionManagement(session -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
);
return http.build();
}
}
实现JWT
JWT是一种无状态的令牌机制,适合用于分布式系统的身份验证。我们需要实现以下功能:
- 生成JWT: 用户登录成功后生成令牌。
- 验证JWT: 在每次请求中验证令牌的有效性。
生成JWT
@Service
public class JwtService {
private final String SECRET_KEY = "your-secret-key";
public String generateToken(UserDetails userDetails) {
return Jwts.builder()
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
}
验证JWT
@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String token = extractToken(request);
if (token != null && validateToken(token)) {
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
getUsernameFromToken(token), null, Collections.emptyList()
);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(request, response);
}
}
测试API
使用Postman或类似的工具测试以下端点:
- 登录:
/api/auth/login - 受保护的资源:
/api/resource
总结
通过本文,我们学习了如何使用Spring Boot和Spring Security构建安全的RESTful API,并整合JWT实现无状态的身份验证。这种方法适用于现代分布式系统,能够有效提升应用的安全性。
1045

被折叠的 条评论
为什么被折叠?



