使用Spring Boot与Spring Security构建安全的RESTful API
引言
在现代Web应用中,安全性是一个不可忽视的重要方面。Spring Boot和Spring Security为开发者提供了一套强大的工具,用于构建安全的RESTful API。本文将详细介绍如何结合JWT(JSON Web Token)实现身份验证与授权,并通过实际代码示例展示完整的实现流程。
技术栈
- 核心框架: Spring Boot, Spring Security
- 身份验证: JWT
- 数据库: H2(示例用)
- 构建工具: Maven
项目初始化
首先,我们需要创建一个Spring Boot项目。可以通过Spring Initializr快速生成项目骨架:
curl https://start.spring.io/starter.zip -d dependencies=web,security,jpa,h2 -d type=maven-project -o secure-api.zip
解压后,导入到IDE中。
配置Spring Security
Spring Security默认提供了基于表单的登录和基本认证。我们需要自定义配置以支持JWT。
添加依赖
在pom.xml
中添加以下依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
创建JWT工具类
public class JwtTokenUtil {
private static final String SECRET_KEY = "your-secret-key";
private static final long EXPIRATION_TIME = 86400000; // 24小时
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static String getUsernameFromToken(String token) {
return Jwts.parserBuilder()
.setSigningKey(SECRET_KEY)
.build()
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
配置安全过滤器
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/public/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()));
}
}
实现RESTful API
创建用户实体
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
// Getters and Setters
}
创建控制器
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/public/hello")
public String publicHello() {
return "Hello, Public!";
}
@GetMapping("/private/hello")
public String privateHello() {
return "Hello, Private!";
}
}
测试
使用Postman或curl测试API:
- 访问
/api/public/hello
,无需认证。 - 访问
/api/private/hello
,需要提供有效的JWT令牌。
总结
通过本文,我们学习了如何使用Spring Boot和Spring Security结合JWT构建安全的RESTful API。从项目初始化到JWT的生成与验证,再到安全过滤器的配置,每一步都通过代码示例进行了详细说明。希望本文能帮助你快速上手安全API的开发。