返回
JWT:让访问受限资源不再受限
后端
2023-11-10 15:31:55
JWT 是一种开放标准(RFC 7519),它定义了紧凑且自包含的方式,可以在各方之间传输信息,这些信息可以进行验证和信任。JWT 通常用于在网络上安全地传输信息,例如在用户认证和授权中。
一、JWT 的工作原理
JWT 由三个部分组成:
-
头部(Header) :包含两个字段:
- typ :JWT 的类型,通常为 "JWT"。
- alg :签名算法,例如 "HS256" 或 "RS256"。
-
有效载荷(Payload) :包含要传输的信息。这些信息可以是任何 JSON 对象,例如用户 ID、用户名、电子邮件地址或任何其他相关数据。
-
签名(Signature) :由头部和有效载荷使用签名算法生成。签名用于验证 JWT 的完整性和真实性。
二、使用 SpringBoot-JWT 生成 Token
在 SpringBoot 中,我们可以使用 JWT 来实现访问受限资源的控制。首先,我们需要创建一个 JWT 令牌。我们可以使用 SpringBoot-JWT 库来生成 JWT 令牌。
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtil {
private static final String SECRET = "123456";
public static String generateToken(String username) {
Date now = new Date();
Date expireTime = new Date(now.getTime() + 1000 * 60 * 60 * 24); // 24 小时后过期
return Jwts.builder()
.setSubject(username)
.setIssuedAt(now)
.setExpiration(expireTime)
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
}
三、使用 Spring Boot 拦截器进行访问控制
在 Spring Boot 中,我们可以使用拦截器来拦截请求并检查 JWT 令牌。我们可以创建一个拦截器来检查 JWT 令牌是否有效,并根据检查结果来决定是否允许请求继续。
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
Claims claims = Jwts.parser().setSigningKey("123456").parseClaimsJws(token).getBody();
if (claims != null && claims.getSubject() != null) {
return true;
}
}
response.setStatus(401);
return false;
}
}
四、总结
JWT 是一种非常流行的 JSON Web 令牌,它可以用来实现访问受限资源的控制。在 SpringBoot 中,我们可以使用 SpringBoot-JWT 库来生成 JWT 令牌,并使用 Spring Boot 拦截器来检查 JWT 令牌是否有效。这样就可以轻松保护我们的受限资源。