返回

3步搞定Spring Boot安全之JWT实践

前端

在 Spring Boot 中利用 JWT 进行安全身份验证和授权

什么是 JWT?

JWT(JSON Web Token)是一种轻量级的、基于 JSON 的标准,用于在不同系统之间安全地传输信息。JWT 令牌由三个主要部分组成:

  • 标头: 包含令牌类型和签名算法。
  • 负载: 包含有关用户的信息,如用户名、角色等。
  • 签名: 用于验证令牌的完整性和真实性。

JWT 广泛应用于身份验证和授权,通过在用户登录成功后颁发令牌,允许用户在后续请求中通过携带令牌来证明自己的身份。

在 Spring Boot 中使用 JWT

生成 JWT 令牌

我们可以使用 JWT 库轻松地生成 JWT 令牌,如下例所示:

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;

public class JwtUtil {

    public static String createJwtToken(String username) {
        JWTCreator.Builder builder = JWT.create();
        builder.withClaim("username", username);
        return builder.sign(Algorithm.HMAC256("secret"));
    }
}

使用过滤器进行身份验证

我们可以使用过滤器拦截来自客户端的请求并进行身份验证,如下例所示:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JwtAuthenticationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        String token = req.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            try {
                JWTVerifier verifier = JWT.require(Algorithm.HMAC256("secret")).build();
                DecodedJWT jwt = verifier.verify(token);
                String username = jwt.getClaim("username").asString();
                // 可以将 username 保存到 request 中,以便后续使用
            } catch (Exception e) {
                res.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid token");
                return;
            }
        }

        chain.doFilter(request, response);
    }
}

从令牌中获取用户信息

解析 JWT 令牌可以提取有关用户的详细信息,如下例所示:

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JwtUtil {

    public static String getUsernameFromToken(String token) {
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256("secret")).build();
        DecodedJWT jwt = verifier.verify(token);
        return jwt.getClaim("username").asString();
    }
}

结论

JWT 是一种功能强大且安全的机制,用于实现用户身份验证和授权。通过在 Spring Boot 中使用 JWT,我们可以轻松实现对 RESTful API 和 Web 应用程序的访问控制。这种方法的安全性、轻量级和跨平台兼容性使其成为身份管理的理想选择。

常见问题解答

  1. JWT 安全吗?
    是的,JWT 使用签名算法(如 HMAC256)对令牌进行加密,确保完整性和真实性。

  2. JWT 的有效期是多久?
    JWT 的有效期由颁发令牌的应用程序决定,可以在令牌的负载中指定。

  3. 如何在前端使用 JWT?
    前端应用程序可以通过使用 JavaScript 库(如 jwt-decode)解析 JWT 令牌。

  4. 什么是 JWT 注入攻击?
    JWT 注入攻击是一种安全漏洞,攻击者可以伪造 JWT 令牌并获得对系统的未授权访问。

  5. 如何防止 JWT 注入攻击?
    可以通过对用户输入进行验证,并确保 JWT 令牌的签名和验证是安全的,来防止 JWT 注入攻击。