在我們的上一篇文章中,我們介紹了基於Spring Boot的JWT(JSON Web Token)認證過濾器的基本實現。在這篇文章中,我們將進一步深入探討JWT在Spring Security中的整合,並詳細介紹如何實現一個 JwtService 來處理 JWT Token 的解析和驗證。
JwtService 是用來處理與JWT相關的所有操作,包括生成 Token、解析 Token、驗證 Token 的有效性等。在這裡,我們會聚焦於從 Token 中提取用戶信息。
import java.security.Key;
import java.sql.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
@Service
public class JwtService {
private static final String SECRET_KEY = "65eFfeoZFi9sTNxfCUsPqzvH7piEoMldXuksQtbVpI+wBsQFyK8Qj6Md6pL1huot";
public String extractUserName(String token) {
return extractClaims(token, Claims::getSubject) ;
}
public <T> T extractClaims(String token, Function<Claims,T> ClaimsResolver) {
final Claims claims =extractClaims(token);
return ClaimsResolver.apply(claims);
}
public String generateToken(UserDetails userDetails) {
return generateToken(new HashMap<>(), userDetails);
}
public String generateToken(
Map<String, Object> extraClaims,
UserDetails userDetails
) {
return Jwts
.builder()
.setClaims(extraClaims)
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 10))
.signWith(getSignInKey(), SignatureAlgorithm.ES256)
.compact();
}
public boolean isTokenValid(String token, UserDetails userDetails) {
final String username = extractClaims(token, Claims::getSubject);
return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
}
private boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}
private java.util.Date extractExpiration(String token) {
return extractClaims(token, Claims::getExpiration);
}
private Claims extractClaims(String token) {
return Jwts
.parserBuilder()
.setSigningKey(getSignInKey())
.build()
.parseClaimsJws(token)
.getBody();
}
private Key getSignInKey() {
byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
return Keys.hmacShaKeyFor(keyBytes);
}
}
下篇文章來解釋這個 class