在现代应用程序中,安全性是一个不可或缺的部分。Spring Security是一种强大且灵活的安全框架,它为Spring应用提供身份验证和授权。结合JSON Web Token(JWT),可以轻松实现无状态的身份验证系统。本文将介绍如何在Spring Boot应用中使用Spring Security与JWT进行用户身份验证。
1. 环境准备
首先,您需要创建一个Spring Boot项目,并添加以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 创建用户实体和存储库
假设您有一个简单的用户实体与存储库:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
// getters and setters
}
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
3. 创建JWT工具类
我们需要一个工具类来生成和解析JWT令牌。
@Component
public class JwtUtil {
private String SECRET_KEY = "your_secret_key";
public String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(Date.from(Instant.now().plus(1, ChronoUnit.HOURS)))
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public String extractUsername(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getSubject();
}
public boolean validateToken(String token, String username) {
String extractedUsername = extractUsername(token);
return (extractedUsername.equals(username) && !isTokenExpired(token));
}
private boolean isTokenExpired(String token) {
Date expiration = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody().getExpiration();
return expiration.before(new Date());
}
}
4. 配置Spring Security
接下来,我们需要配置Spring Security以支持JWT。
```java @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtUtil jwtUtil;
@Override
protected void configure(HttpSecurity http) throws Exception {
http