SpringBoot 使用jwt进行身份验证的方法示例

yizhihongxing

来为你讲解一下如何使用 SpringBoot 进行 jwt 身份验证的方法示例攻略。

简介

JWT,即 JSON Web Token,是一种用于身份验证的标准。在 Spring Boot 中使用 JWT 进行身份验证,可以避免使用传统的 session 和 cookie 方式进行身份验证所存在的一些问题。本文将为大家讲解如何在 Spring Boot 中使用 JWT 进行身份验证的方法示例。

1. 添加依赖

在 Spring Boot 中,可以使用一些现成的组件来实现 JWT 的生成和验证。我们可以使用 jjwt 或者 auth0 组件,具体建议按需选择。

以 auth0 组件为例,在 pom.xml 文件中添加以下依赖:

<!-- auth0 组件 -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.18.1</version>
</dependency>

<!-- 封装的 jwt 工具类 -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>auth0</artifactId>
    <version>1.13.0</version>
</dependency>

2. 实现认证授权逻辑

在实现认证授权逻辑之前,需要为项目添加一个 JWT 工具类,用于生成和验证 token。

以下是一个简单的 JWT 工具类实现:

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component("jwtUtil")
public class JwtUtil {

    private static final String SIGN_SECRET = "my_secret_123456"; // 密钥
    private static final long EXPIRATION_TIME = 30 * 60 * 1000; // 过期时间

    /**
     * 生成 token
     * @param username 用户名
     * @return token
     */
    public String createToken(String username) {
        Date now = new Date();
        Date expiresAt = new Date(now.getTime() + EXPIRATION_TIME);

        return JWT.create().withIssuer("my-website")
                .withSubject(username)
                .withExpiresAt(expiresAt)
                .withIssuedAt(now)
                .sign(Algorithm.HMAC256(SIGN_SECRET));
    }

    /**
     * 验证 token
     * @param token token
     * @return 是否验证成功
     */
    public boolean verifyToken(String token) {
        try {
            JWT.require(Algorithm.HMAC256(SIGN_SECRET)).build().verify(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取 token 中的用户名
     * @param token token
     * @return 用户名
     */
    public String getUsername(String token) {
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getSubject();
    }
}

然后,我们可以在代码中使用该工具类生成和验证 token。

以下是一个示例实现,用于在登录时生成 token。

@RestController
public class UserController {
    @Autowired
    private JwtUtil jwtUtil;
    @Autowired
    private UserService userService;

    /**
     * 登录,成功则返回 token
     * @param username 用户名
     * @param password 密码
     * @return token
     */
    @PostMapping("/login")
    public ResponseEntity<String> login(@RequestParam String username, @RequestParam String password) {
        User user = userService.findUserByUsername(username);
        if (user != null && user.getPassword().equals(password)) {
            String token = jwtUtil.createToken(username);
            return ResponseEntity.ok(token);
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("用户名或密码错误");
        }
    }
}

以下是一个示例实现,用于验证需要授权的操作。

@RestController
public class UserController {
    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 获取用户信息,需要 token 鉴权
     * @param request 请求
     * @return 用户信息
     */
    @GetMapping("/user")
    public ResponseEntity<String> user(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if (StringUtils.isEmpty(token)) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("token 为空");
        }
        String username = jwtUtil.getUsername(token);
        if (StringUtils.isEmpty(username)) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("token 不正确");
        }
        return ResponseEntity.ok("用户信息:" + username);
    }
}

3. 示例操作

首先,我们要模拟一个用户登录的场景。可以使用 Postman 工具,发送以下 POST 请求:

POST http://localhost:8080/login
Content-Type: application/x-www-form-urlencoded

username=admin&password=admin123

如果登录成功,将返回上一步实现中的 token。然后,我们再使用 Postman 工具,发送以下 GET 请求:

GET http://localhost:8080/user
Authorization: [token]

其中,[token] 为登录成功后返回的 token。如果 token 正确,则将返回用户信息。

总结

通过以上示例,我们学习了如何使用 Spring Boot 进行 jwt 身份验证的方法。首先,我们添加了 auth0 组件,在 pom.xml 中引入了相关依赖。然后,我们实现了认证授权逻辑,包括一个 JWT 工具类和相关账户的登录和需要鉴权的操作接口。最后,我们通过 Postman 工具模拟用户登录和获取用户信息的操作,成功获取到了用户信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 使用jwt进行身份验证的方法示例 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java利用for循环输出空心三角形、空心菱形和空心矩形的代码

    让我们来详细讲解Java利用for循环输出空心三角形、空心菱形和空心矩形的代码。 输出空心三角形 首先,我们要理解空心三角形的形状,它是由多个递进的空格和星号组成的,而每行的符号数都是依次递增或递减的。 下面是一个输出空心三角形的示例代码: public class HollowTriangle { public static void main(Strin…

    Java 2023年5月26日
    00
  • Java抛出异常与自定义异常类应用示例

    Java中的异常处理是必不可少的,它可以让我们的代码更加健壮,提高程序的容错性。Java抛出的异常有两种,一种是系统自带的异常,如IOException、NullPointerException等,另一种是自定义异常,可以根据业务需要自行定义。 本篇攻略将详细讲解Java抛出异常与自定义异常类的应用示例,希望能够对大家有所帮助。 Java抛出异常示例 Jav…

    Java 2023年5月27日
    00
  • java对象类型转换和多态性(实例讲解)

    下面我将详细讲解Java对象类型转换和多态性的完整攻略。 对象类型转换 在Java中,对象类型转换分为向上转型和向下转型两种。 向上转型 向上转型指的是将一个子类对象转换为父类对象的过程。因为子类是继承自父类的,所以子类对象的类型也包含了父类对象的所有类型,所以可以将子类对象转换为父类对象。 向上转型的格式如下: 父类名 变量名 = 子类实例; 例如,有一个…

    Java 2023年5月26日
    00
  • Spring JPA之save方法示例详解

    让我来为你详细讲解“Spring JPA之save方法示例详解”。 什么是Spring JPA Spring JPA是Spring框架中的一个模块,它提供了基于注解和接口的方式来简化数据库访问操作,让开发者可以更便捷地进行持久化操作。 save方法简介 save方法是Spring JPA中提供的一个方法,用于将一个实体对象保存到数据库中。它有两个重载方法,分…

    Java 2023年5月20日
    00
  • Spring Security OAuth过期的解决方法

    下面是针对“Spring Security OAuth过期的解决方法”的完整攻略: Spring Security OAuth过期的解决方法 问题描述 在使用Spring Security OAuth时,有可能会遇到令牌(expired_token)过期的问题,导致无法访问受保护的资源。这时需要找到一种解决办法。 解决方法 方法一:自定义TokenServi…

    Java 2023年5月20日
    00
  • 完美解决java.lang.OutOfMemoryError处理错误的问题

    下面我将详细讲解如何完美解决 java.lang.OutOfMemoryError 错误的处理问题。 什么是 java.lang.OutOfMemoryError 错误? java.lang.OutOfMemoryError 错误是指 Java 应用程序在运行时申请的内存超过了 Java 虚拟机所能分配的最大内存限制,导致 Java 虚拟机耗尽了可用内存造成…

    Java 2023年5月27日
    00
  • 源码解析Spring 数据库异常抽理知识点总结

    源码解析Spring 数据库异常抽象知识点总结 异常抽象 在Java应用中处理数据库操作时,经常会出现各种数据库异常,例如连接超时、SQL语法错误等。这些异常信息通常是非常繁琐和冗长的,不利于开发者理解和处理异常。Spring提供了丰富的异常抽象支持,可以有效地降低程序员处理异常的复杂度,提升开发效率。 Spring 提供了以下几种异常: DataAcces…

    Java 2023年5月20日
    00
  • jsp实现从服务器下载xls文件到客户端的方法

    实现从服务器下载xls文件到客户端通常可以通过以下步骤来完成: 服务器端准备Excel文件 首先需要在服务器端生成或获取Excel文件。一种常见的方式是使用Java POI库来动态生成Excel文件。例如,以下代码可以生成一个包含数据的Excel文件: // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部