SpringBoot之JWT令牌校验

举报
鱼弦 发表于 2025/02/16 23:27:08 2025/02/16
【摘要】 SpringBoot之JWT令牌校验介绍JSON Web Token(JWT)是一种轻量级的、自包含的、基于JSON的开放标准(RFC 7519),用于在双方之间安全地传输信息。在SpringBoot应用中,JWT令牌校验是一种常见的身份验证和授权机制,它允许服务器验证客户端请求的合法性,确保只有经过授权的请求才能访问受保护的资源。应用使用场景‌用户认证与授权‌:在用户成功登录后,服务器生成...

SpringBoot之JWT令牌校验
介绍

JSON Web Token(JWT)是一种轻量级的、自包含的、基于JSON的开放标准(RFC 7519),用于在双方之间安全地传输信息。在SpringBoot应用中,JWT令牌校验是一种常见的身份验证和授权机制,它允许服务器验证客户端请求的合法性,确保只有经过授权的请求才能访问受保护的资源。

应用使用场景
‌用户认证与授权‌:在用户成功登录后,服务器生成一个JWT令牌并返回给客户端。客户端在后续请求中将此令牌附加到HTTP头中,以便服务器进行身份验证和授权。
‌API网关的身份验证‌:在微服务架构中,API网关作为所有外部请求进入系统的入口点,使用JWT令牌校验可以确保只有经过授权的服务才能接收到来自客户端的数据。
‌跨域资源共享(CORS)‌:由于JWT令牌完全依赖于令牌本身携带的信息来进行验证,不受同源策略限制,因此适用于跨域请求场景。
不同场景下详细代码实现

  1. 引入JWT依赖

在pom.xml文件中添加JWT相关的依赖:

xml
Copy Code
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>

  1. 生成JWT令牌

在服务端生成JWT令牌,并返回给客户端:

java
Copy Code
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {

private static final String SECRET_KEY = "your_secret_key";

public static String generateJwt(String userId, String username) {
    Map<String, Object> claims = new HashMap<>();
    claims.put("userId", userId);
    claims.put("username", username);

    return Jwts.builder()
            .setClaims(claims)
            .setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 1天过期
            .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
            .compact();
}

}

  1. JWT令牌校验

在请求到达服务端时,进行JWT令牌校验:

java
Copy Code
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {

private static final String SECRET_KEY = "your_secret_key";

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {

    String authorizationHeader = request.getHeader("Authorization");

    if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
        String jwt = authorizationHeader.substring(7);
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(jwt)
                    .getBody();

            String userId = claims.get("userId").toString();
            String username = claims.get("username").toString();

            // 将用户信息设置到请求上下文中,以便后续使用
            request.setAttribute("userId", userId);
            request.setAttribute("username", username);

            filterChain.doFilter(request, response);
        } catch (Exception e) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid JWT token");
        }
    } else {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "JWT token is missing");
    }
}

}

  1. 配置过滤器

在Spring Boot应用中配置JWT过滤器:

java
Copy Code
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private JwtAuthenticationFilter jwtAuthenticationFilter;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
            .antMatchers("/auth/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
}

@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() {
    return new JwtAuthenticationFilter();
}

}

原理解释

JWT令牌由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包含了令牌使用的加密算法信息,载荷包含了所需传输的用户信息,签名用于保证令牌的完整性和真实性,防止令牌被篡改。服务器在生成JWT令牌时,使用指定的加密算法对头部和载荷进行签名。客户端在后续请求中携带JWT令牌,服务器通过验证签名来确认令牌的合法性。

算法原理流程图

由于算法原理涉及多个步骤和组件,这里提供一个简化的流程图来描述JWT令牌校验的过程:

‌客户端请求‌:客户端携带JWT令牌发送请求。
‌过滤器拦截‌:JWT过滤器拦截请求,并提取JWT令牌。
‌令牌校验‌:过滤器对JWT令牌进行校验,包括验证签名、检查过期时间等。
‌请求处理‌:如果令牌校验通过,则继续处理请求;否则返回错误响应。
实际详细应用代码示例实现

请参考上述不同场景下的详细代码实现。

测试步骤以及详细代码

测试步骤通常包括:

‌启动Spring Boot应用‌:确保应用已经成功启动,并能够处理HTTP请求。
‌生成JWT令牌‌:通过登录接口或其他方式生成JWT令牌。
‌发送请求‌:使用工具(如Postman、Curl等)携带JWT令牌发送请求。
‌验证响应‌:检查服务器返回的响应是否符合预期,包括是否成功处理了请求或返回了错误响应。
部署场景

Spring Boot应用可以部署在多种环境中,包括本地开发环境、测试环境、生产环境等。常见的部署方式包括:

‌本地部署‌:在本地机器上直接运行Spring Boot应用。
‌服务器部署‌:将Spring Boot应用打包成可执行的JAR文件或WAR文件,并部署到服务器上。
‌容器化部署‌:将Spring Boot应用打包成Docker镜像,并部署到容器化环境中(如Kubernetes)。
材料链接

由于版权和隐私原因,无法直接提供材料链接。但你可以在Spring Boot和JWT的官方文档、GitHub仓库以及相关的技术社区中找到相关的学习材料和示例代码。

总结

JWT令牌校验是SpringBoot应用中一种常见的身份验证和授权机制,它允许服务器验证客户端请求的合法性。通过引入JWT依赖、生成JWT令牌、配置JWT过滤器等步骤,可以在Spring Boot应用中实现JWT令牌校验。JWT令牌校验具有无状态性、跨平台性、安全性高和灵活性强的优点,适用于多种应用场景。

未来展望

随着Web技术的不断发展,JWT令牌校验机制也将不断演进和完善。未来,我们可以期待JWT在安全性、性能、易用性等方面提供更加出色的表现。同时,随着微服务架构的普及,JWT令牌校验在分布式系统中的应用也将越来越广泛。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。