返回
3步搞定Spring Boot安全之JWT实践
前端
2023-03-19 20:54:40
在 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 应用程序的访问控制。这种方法的安全性、轻量级和跨平台兼容性使其成为身份管理的理想选择。
常见问题解答
-
JWT 安全吗?
是的,JWT 使用签名算法(如 HMAC256)对令牌进行加密,确保完整性和真实性。 -
JWT 的有效期是多久?
JWT 的有效期由颁发令牌的应用程序决定,可以在令牌的负载中指定。 -
如何在前端使用 JWT?
前端应用程序可以通过使用 JavaScript 库(如 jwt-decode)解析 JWT 令牌。 -
什么是 JWT 注入攻击?
JWT 注入攻击是一种安全漏洞,攻击者可以伪造 JWT 令牌并获得对系统的未授权访问。 -
如何防止 JWT 注入攻击?
可以通过对用户输入进行验证,并确保 JWT 令牌的签名和验证是安全的,来防止 JWT 注入攻击。