返回

JWT:让访问受限资源不再受限

后端

JWT 是一种开放标准(RFC 7519),它定义了紧凑且自包含的方式,可以在各方之间传输信息,这些信息可以进行验证和信任。JWT 通常用于在网络上安全地传输信息,例如在用户认证和授权中。

一、JWT 的工作原理

JWT 由三个部分组成:

  1. 头部(Header) :包含两个字段:

    • typ :JWT 的类型,通常为 "JWT"。
    • alg :签名算法,例如 "HS256" 或 "RS256"。
  2. 有效载荷(Payload) :包含要传输的信息。这些信息可以是任何 JSON 对象,例如用户 ID、用户名、电子邮件地址或任何其他相关数据。

  3. 签名(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 令牌是否有效。这样就可以轻松保护我们的受限资源。