当前位置:网站首页 > Java教程 > 正文

java jwt token 教程



本文将会带你了解在 Spring Boot 中如何使用 Spring Security、JWT 和 MySQL 数据库实现基于 Token 的身份认证。

JWT 是 JSON Web Token 的缩写,是一种安全地在各方之间传输信息的开放标准。它是一种紧凑、自包含的数据传输方法,通常用于客户端和服务器之间的数据传输。

JWT 通常用于认证和授权,服务器通过验证 JWT 中包含的数字签名来验证用户。

JWT 由三部分组成:Header、Payload 和 Signature(签名)。

  • Header 包含 Token 类型和 Token 签名算法的元数据。
  • Payload 包含关于被验证用户或实体的声明(Claim)或陈述。这些声明可包括用户 ID、用户名或电子邮件地址等信息。
  • Signature(签名)使用秘钥和 Header 及 Payload 生成,以确保 JWT 的完整性。

使用 JWT 的一个好处是它们是无状态的,这意味着服务器无需跟踪用户的身份认证状态。这可以提高可扩展性和性能。此外,JWT 可以在不同的域和服务中使用,只要它们共享相同的秘钥来验证签名即可。

Spring Security 是一个提供身份认证、授权和防护常见攻击的框架。它为确保 Web 和响应式应用程序的安全提供一流的支持,是保护基于 Spring 的应用程序的事实标准。

Spring Security 用于保护 Web 应用程序、REST API 和微服务的安全,为身份认证和授权提供内置支持。

数据库表关系图

添加如下依赖到 Spring Boot 项目:

通过如下命令在 MySQL 中创建一个数据库,名为 :

使用 MySQL数据库,需要配置数据库 URL、用户名和密码,以便 Spring 能在启动时与数据库建立连接。编辑 文件,添加以下属性:

创建 和 JPA 实体,并在它们之间建立 多对多(MANY-to-MANY) 关系。

使用 JPA 注解在 和 实体之间建立 多对多 关系。

在 Spring boot 项目中创建一个 包,并添加以下与 JWT 相关的类。

创建 类,如下:

由 用来启动身份认证方案。它是一个入口点,用于检查用户是否已通过身份认证,如果用户已经认证,则登录该用户,否则抛出异常(unauthorized)。通常情况下,在简单的应用程序中可以直接使用该类,但当在 REST、JWT 等中使用 Spring Security 时,就必须对其进行继承,以提供更好的 Spring Security 过滤器链(filter chain)管理。

在 文件中添加以下两个与 JWT 相关的属性:

创建一个名为 工具类,用于生成、验证 JWT 以及从 JWT 中提取信息。

generateToken 方法

方法根据提供的 对象生成一个新的 JWT,该对象包含被验证用户的信息。它使用 方法创建一个新的 对象,设置 JWT 的 subject(即用户名)、发布日期(issue date)和到期日期(expiration date),并使用 方法对 JWT 进行签名。最后,它会以字符串形式返回 JWT。

getUsername(String token)

方法从提供的 JWT 中提取 username。该方法使用 方法创建一个新的 对象,使用 方法设置签名密钥(Signing Key),并使用 方法解析 JWT。然后,它会从 JWT 的 对象中获取 subject(即用户名),并以字符串形式返回。

validateToken(String token)

方法会验证所提供的 JWT。该方法使用 方法创建一个新的 对象,使用 方法设置签名密钥,并使用 方法解析 JWT。如果 JWT 有效,该方法会返回 。如果 JWT 无效或已过期,该方法会使用 logger 对象输出错误信息并返回 。

在 Spring Boot 应用程序中创建 类,该类可拦截传入的 HTTP 请求并验证包含在 头中的 JWT Token。如果 Token 有效,Filter 就会在 中设置当前用户的 。

上述代码的关键点如下:

  • 该类继承了 Spring 的 ,可确保每个请求只执行一次过滤器。
  • 构造函数需要两个依赖: 和 ,它们是通过 Spring 的构造函数依赖注入机制注入的。
  • 方法是 Filter 的主要逻辑。它使用 方法从 Header 中提取 JWT Token,使用 类验证 Token,并在 中设置 Authentication 信息。
  • 方法会解析 Header,并返回 Token 部分。
  • 用于存储当前 request 的 信息。在这种情况下,Filter 会将 与该 Token 关联的 和 (授权)设置在一起。

创建一个 Service,根据 或 从数据库中加载用户详细信息。

创建一个 ,它实现了 接口(Spring Security 内置接口),并提供了 方法的实现:

Spring Security 使用 接口,该接口包含 方法,用于查找给定 的 。

接口代表一个经过认证的用户对象,Spring Security 提供了 的开箱即用实现。

创建 类,并添加以下配置:

注解表示该类定义了 Spring Application Context 的配置。

注解来自 Lombok 库,它会生成一个包含所有用 注解的字段的构造函数。

方法是一个 Bean,用于创建 实例,对密码进行编码。

方法是一个定义安全过滤器链(Security Filter Chain)的 Bean。 参数用于配置应用程序的安全设置。在本例中,该方法禁用 CSRF 保护,并根据 HTTP 方法和 URL 授权请求。

方法是一个提供 的 Bean。它从 实例中检索 Authentication Manager。

创建一个 service 包,并添加以下与 service 层相关的 接口和 类。

这是 接口的实现。它包含一个方法 ,用于处理应用程序的登录功能。 对象包含用户输入的用户名(username)和密码(password)。

该类的构造函数需要四个参数:、、 和 。

在 方法中, 会尝试将用户的 凭证传递给 ,从而对用户进行身份认证。如果认证成功,将使用 对象生成一个 Token 并返回给调用者。

该 service 类使用 注解,表明它是 Spring 服务组件,可由 Spring Context 自动发现。

创建 类,并添加以下代码:

这段代码定义了一个用于用户身份认证的 REST API 端点。它通过 URL 接收 请求,请求体中的登录凭证是一个 JSON 对象。 对象用于将 JSON 对象映射到 Java 对象。

类有一个构造函数,用于接收 的实例, 提供了身份认证逻辑。

方法接收 对象作为参数,并调用 的 方法来执行身份认证。如果验证成功, 方法会返回一个 JWT Token。然后,该 Token 被封装在一个 对象中,并作为响应返回。

注解将方法映射为 HTTP 方法。 注解表示请求体应映射到 对象。

在测试 Spring Security 和 JWT 之前,请确保使用以下 SQL 脚本将数据插入相应的表中:

Hibernate 会自动创建数据库表,因此无需手动创建。

测试返回 JWT Token 的登录 REST API,如下:

在 Postman 中测试登录 REST API

一切OK!


参考:

版权声明


相关文章:

  • java编号教程2024-11-21 15:26:06
  • java rabbitmq教程2024-11-21 15:26:06
  • java 程序破解教程2024-11-21 15:26:06
  • 尚学堂科技马士兵java视频教程2024-11-21 15:26:06
  • java md5教程2024-11-21 15:26:06
  • java大学教程 脚本之家2024-11-21 15:26:06
  • java lambda 教程2024-11-21 15:26:06
  • java离线联机教程2024-11-21 15:26:06
  • 廖海峰java教程2024-11-21 15:26:06
  • java kotlin教程2024-11-21 15:26:06