Spring Boot + JWT = 安全无忧的RESTful API

这篇具有很好参考价值的文章主要介绍了Spring Boot + JWT = 安全无忧的RESTful API。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在构建现代Web应用程序时,安全性是一个不可或缺的要素。JSON Web Token(JWT)提供了一种简洁的方式来保护我们的RESTful接口。在本篇博客中,我们将一步步探索如何在Spring Boot应用中整合JWT,确保你的API安全、高效且易于管理。

JWT简介

JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。这些信息可以被验证和信任,因为它是数字签名的。

为什么选择JWT

对于Web应用程序,尤其是当涉及到单页面应用(SPA)时,JWT提供了一种有效的认证机制。与传统的Session认证相比,JWT是无状态的,不需要在服务器上存储用户的状态信息,这使得它非常适合于分布式微服务架构。

Spring Boot中整合JWT

在Spring Boot中整合JWT,我们需要完成以下步骤:

  1. 添加依赖
  2. 配置JWT库
  3. 实现JWT认证过滤器
  4. 配置Spring Security
  5. 测试保护的API

实战演练:构建一个示例应用

让我们通过构建一个简单的Spring Boot应用来演示JWT的整合过程。

添加依赖

首先,在你的pom.xml中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!-- 其他依赖 -->
</dependencies>

配置JWT库

接下来,我们需要创建一个工具类来生成和解析JWT:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtUtil {
    private static final String KEY = "mySecretKey";

    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小时有效期
                .signWith(SignatureAlgorithm.HS512, KEY)
                .compact();
    }

    public static String validateTokenAndGetSubject(String token) {
        return Jwts.parser()
                .setSigningKey(KEY)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
}

实现JWT认证过滤器

现在,我们创建一个JWT认证过滤器来验证令牌的有效性:

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;

public class JwtAuthenticationFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
        String token = request.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            String username = JwtUtil.validateTokenAndGetSubject(token);
            if (username != null) {
                UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
                SecurityContextHolder.getContext().setAuthentication(auth);
            }
        }
        filterChain.doFilter(request, response);
    }
}

配置Spring Security

我们需要配置Spring Security来使用我们的JWT过滤器:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/api/public").permitAll()
            .anyRequest().authenticated()
            .and()
            .addFilter(new JwtAuthenticationFilter(authenticationManager()));
    }
}

测试保护的API

最后,我们创建一个受保护的API端点和一个公开端点作为测试:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @GetMapping("/api/public")
    public String publicEndpoint() {
        return "Public content";
    }

    @GetMapping("/api/private")
    public String privateEndpoint() {
        return "Private content";
    }
}

JWT的最佳实践

  • 保持密钥的安全
  • 设置合理的过期时间
  • 处理令牌失效的情况
  • 只通过HTTPS传输JWT

总结

通过这个简单的例子,我们看到了如何在Spring Boot应用程序中使用JWT进行安全认证。JWT的整合提高了我们API的安全性,同时保持了良好的性能和可扩展性。如果你想要构建一个安全且现代的Web应用程序,那么Spring Boot和JWT无疑是你的不二之选。文章来源地址https://www.toymoban.com/news/detail-787037.html

到了这里,关于Spring Boot + JWT = 安全无忧的RESTful API的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中使用Spring Boot创建RESTful API

    在当今的Web开发中,构建RESTful API已经成为一个常见的任务。Spring Boot框架提供了一种简单、快速和高效的方式来创建和部署这样的API。本文将引导您逐步了解如何使用Spring Boot来构建和开发RESTful API。 首先,我们需要设置开发环境。确保您的系统上已经安装了以下软件: Ja

    2024年02月10日
    浏览(41)
  • Spring Boot 3.x- RESTful API集成SpringDoc&Swagger-UI

    系列文章:Spring Boot 3.x 系列教程 springdoc-openapi 帮助使用Spring Boot项目自动化API文档的生成。 springdoc-openapi 的工作原理是在运行时检查应用程序,根据Spring配置、类结构和各种注释推断 API 语义。 自动生成 JSON/YAML 和 HTML 格式的 API 文档。这个文档可以通过使用 swagger-api 注解来

    2024年01月25日
    浏览(38)
  • Spring Boot学习随笔- RestFul API(@RestController、@RequestBody、@PathVariable),使用ResponseEntity+HttpStatus作为返回值

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 什么是REST REST 全称是 Resource Representational State Transfer ,中文意思是表述性状态转移,它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。他在论文中表示:我这篇文章的目的就是想在符合

    2024年02月04日
    浏览(29)
  • Spring Boot 优雅集成 Spring Security 5.7(安全框架)与 JWT(双令牌机制)

    本章节将介绍 Spring Boot 集成 Spring Security 5.7(安全框架)。 🤖 Spring Boot 2.x 实践案例(代码仓库) Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring

    2024年02月12日
    浏览(34)
  • Spring Boot 3 + JWT + Security 联手打造安全帝国:一篇文章让你掌握未来!

    Spring Security 已经成为 java 后台权限校验的第一选择.今天就通过读代码的方式带大家深入了解一下Security,本文主要是基于开源项目spring-boot-3-jwt-security来讲解Spring Security + JWT(Json Web Token).实现用户鉴权,以及权限校验. 所有代码基于 jdk17+ 构建.现在让我们开始吧! Springboot 3.0 Spri

    2024年02月07日
    浏览(39)
  • 用API Key保护Spring Boot 接口的安全

         安全性在REST API开发中扮演着重要的角色。一个不安全的REST API可以直接访问到后台系统中的敏感数据。因此,企业组织需要关注API安全性。         Spring Security  提供了各种机制来保护我们的  REST API 。其中之一是  API  密钥。API 密钥是客户端在调用 API 调用时提

    2024年02月12日
    浏览(40)
  • 【Spring Boot】SpringBoot 优雅整合Swagger Api 自动生成文档

    Swagger 是一套 RESTful API 文档生成工具,可以方便地生成 API 文档并提供 API 调试页面。 而 Spring Boot 是一款非常优秀的 Java Web 开发框架,它可以非常方便地构建 Web 应用程序。 在本文中,我们将介绍如何使用 Swagger 以及如何在 Spring Boot 中整合 Swagger 。 首先,在 pom.xml 文件中添

    2023年04月22日
    浏览(34)
  • SpringBoot生成RESTful API文档

    由于我一开始学习的SpringBoot是3以上版本,所以我这里用到的也是支持和SpringBoot3能够整合的SpringDoc 这里先说一下,其实SpringDoc就是Swagger3版本,我一开始整合的2版本,比较麻烦况且最后SpringBoot程序都启动不了了,后面查资料才看到SpringDoc,好使的一批!! 官网地址:http:

    2024年02月08日
    浏览(44)
  • Spring boot 整合 JWT

    第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Spring Cloud Netflix 之 Hystrix 第九章 代码管理gitlab 使用 第十章 Spr

    2024年02月05日
    浏览(34)
  • 深入探讨Spring Boot:实现一个完整的RESTful应用程序

    在这篇博客中,我们将深入探讨如何使用Spring Boot构建一个完整的RESTful应用程序,数据库选择MySQL。我们将通过实现一个简单的用户管理系统来演示Spring Boot的强大功能。 首先,访问Spring Initializr,选择以下依赖项: Web:用于创建Web应用程序 JPA:用于访问数据库 MySQL:用于连

    2024年02月03日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包