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

来为你讲解一下如何使用 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工具类BeanUtils库介绍及实例详解

    Java工具类BeanUtils库介绍及实例详解 什么是BeanUtils BeanUtils 是 Apache 组织下的一个开源 Java 工具类库,它提供了一个简单的 API,以便应用开发人员能够快速地使用反射方式实现 JavaBean 的属性拷贝、生成新对象等操作,尤其适用于对象之间属性值的复制,使得开发者无需编写繁琐的属性赋值代码。BeanUtils…

    Java 2023年5月26日
    00
  • SpringMvc框架的简介与执行流程详解

    以下是关于“SpringMVC框架的简介与执行流程详解”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一种常用的Java Web开发框架,它基于MVC(Model-View-Controller)模式,将Web应用程序分为三个部分:模型、视图和控制器。本攻略将详细讲解SpringMVC框架的简介和执行流程。 2. 简介 SpringMVC框…

    Java 2023年5月16日
    00
  • Java中的对称加密详解

    Java中的对称加密详解 本文将详细讲解Java中对称加密的原理及实现方式。对称加密是一种加密方式,使用同一个密钥进行加密和解密,是数据安全传输中常用的一种方式。 对称加密的原理 对称加密使用同一把密钥进行加密和解密,一般分为如下三个步骤: 明文加密 密文传输 密文解密 使用一把密钥可以实现两个相同结构的模块进行数据通信时进行加解密操作。对称加密的优点是速度…

    Java 2023年5月19日
    00
  • Java环境下高德地图Api的使用方式

    Java环境下高德地图API的使用方式 介绍 高德地图API是高德公司提供的一组Web API,可用于在Web端,移动端或桌面端应用程序中调用地图相关服务和信息。本文将介绍在Java环境下如何使用高德地图API,包括如何进行账号注册、申请API key以及操作地图API的使用方式。 环境 Java环境:Java 8及以上版本 IDE:Eclipse或Inte…

    Java 2023年5月19日
    00
  • 详解Java中的延时队列 DelayQueue

    详解Java中的延时队列 DelayQueue 概述 DelayQueue是Java中的一个实现了Delayed的队列,它按照剩余时间从少到多的顺序对元素进行排序,每个元素都有一个过期时间,只有过期的元素才能被取出。 延时队列的实现 延时队列的实现需要实现Delayed接口,并重写getDelay()方法和compareTo()方法。 public inte…

    Java 2023年5月26日
    00
  • MyBatis映射关系详解

    下面是对”MyBatis映射关系详解”的详细解释及示例。 MyBatis映射关系详解 在MyBatis框架中,映射关系是将SQL语句和Java对象之间的关系进行映射,使得Java对象和数据库表之间的操作变得简单。在MyBatis中,映射关系可以通过XML文档或注解进行配置。 XML映射关系配置 XML映射关系配置主要包括以下两个部分: 结果映射 结果映射是将…

    Java 2023年5月19日
    00
  • java线程之使用Runnable接口创建线程的方法

    使用Runnable接口创建线程的方法是Java中最基本、最常见的线程创建方式。下面我将为大家详细介绍如何使用该方法创建线程。 步骤一:创建一个实现Runnable接口的类 要使用Runnable接口创建线程,首先需要创建一个实现了该接口的类。这个类要重写run()方法,并实现线程的具体逻辑。例如: public class MyRunnable imple…

    Java 2023年5月19日
    00
  • Java如何基于反射获取对象属性信息

    获取Java对象的属性信息是Java语言中很常见的一个需求,在Java中通过反射机制可以很方便的完成。本篇攻略将会详细讲解如何基于反射获取Java对象的属性信息。 反射机制 Java的反射机制是指在程序运行时获取类的相关信息,可以获取类名、属性、方法等相关信息。Java反射机制是通过Java.lang.reflect包中的类和接口实现的,主要应用在框架开发、…

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