实现JWT认证与授权的Spring Boot项目详解

我们将详细介绍如何使用JWT(JSON Web Tokens)结合Spring Boot框架实现用户认证和授权系统。此方案将包括用户注册、登录以及通过JWT令牌进行后续请求的身份验证过程。我们将从引入必要的依赖开始,然后逐步构建项目的各个部分,包括JWT生成类、Controller、Service、ServiceImpl、Mapper以及异常处理机制。

引入依赖坐标

首先,确保你的pom.xml文件包含了以下依赖,这些依赖涵盖了Web启动、MyBatis集成、数据库连接、Lombok、测试、数据校验以及JWT库。

xml 复制代码
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
  </dependency>

  <dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter-test</artifactId>
    <version>3.0.3</version>
    <scope>test</scope>
  </dependency>
  <!--校验注解-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
  </dependency>
  <dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.14.0</version>
  </dependency>

</dependencies>

JWT生成类

接下来定义一个JWT工具类,用于生成和解析JWT令牌。

java 复制代码
package com.leo.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtil {

    private static final String KEY = "jiongjiong";

    //接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
        .withClaim("claims", claims)
        .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
        .sign(Algorithm.HMAC256(KEY));
    }

    //接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
        .build()
        .verify(token)
        .getClaim("claims")
        .asMap();
    }

}

Controller层

定义UserController,处理用户注册和登录请求。

java 复制代码
package com.leo.controller;

import com.leo.pojo.Result;
import com.leo.service.UserService;
import org.hibernate.validator.constraints.Length;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author leijiong
 * @version 1.0
 */
@RestController
@RequestMapping("/user")
@Validated
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/register")
    public Result register(@Length(min = 5, max = 16) String username, @Length(min = 5, max = 16)String password) {
        return  userService.register(username, password);
    }

    @PostMapping("/login")
    public Result<String> login(@Length(min = 5, max = 16) String username, @Length(min = 5, max = 16)String password) {
        return userService.login(username, password);
    }
}

Service层

定义UserService接口和其实现类UserServiceImpl,处理用户的注册和登录逻辑。

java 复制代码
package com.leo.service;

import com.leo.pojo.Result;
import com.leo.pojo.User;

/**
 * @author leijiong
 * @version 1.0
 */
public interface UserService {

    Result register(String username, String password);

    Result<String> login(String username, String password);
}

Mapper层

定义UserMapper接口,用于执行SQL操作。

java 复制代码
package com.leo.service;

import com.leo.pojo.Result;
import com.leo.pojo.User;

/**
 * @author leijiong
 * @version 1.0
 */
public interface UserService {

    Result register(String username, String password);

    Result<String> login(String username, String password);
}

异常处理

最后,添加全局异常处理类,以便在出现异常时统一返回错误信息。

java 复制代码
package com.leo.mapper;

import com.leo.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

/**
 * @author leijiong
 * @version 1.0
 */
@Mapper
public interface UserMapper {

    @Select("select * from user where username = #{username};")
    User findUsername(String username);

    @Insert("insert into user (username, password, create_time, update_time) values" +
            "(#{username}, #{password}, now(), now())")
    void add(String username, String password);
}

补充:数据校验框架

1.引入依赖坐标

xml 复制代码
<!--校验注解-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.使用方式

总结

通过以上步骤,我们已经建立了一个基本的JWT认证与授权系统,可以用于Spring Boot应用中,实现安全的用户管理功能。在实际部署时,还需要考虑更多细节,例如配置跨域请求、实现JWT拦截器等。

相关推荐
凡人的AI工具箱1 小时前
40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)
开发语言·后端·安全·架构·golang
我的运维人生1 小时前
Spring Boot应用开发实战:构建RESTful API服务
spring boot·后端·restful·运维开发·技术共享
颜淡慕潇1 小时前
【K8S系列】深入解析 Kubernetes 中的 Deployment
后端·云原生·容器·kubernetes
Iced_Sheep2 小时前
Spring @Transactional 你真的会用吗???
后端·spring
黄昏_2 小时前
在Springboot项目中实现将文件上传至阿里云 OSS
java·spring boot·后端·阿里云
写bug写bug2 小时前
用Java Executors创建线程池的9种方法
java·后端
努力的小雨2 小时前
借助AI助手如何高效排查SQL问题
人工智能·后端·豆包marscode
2301_811274313 小时前
基于Vue+SpringBoot的考研学习分享平台设计与实现
vue.js·spring boot·考研
程序员阿龙3 小时前
基于SpringBoot的京东绿谷旅游信息服务平台设计与实现(源码+定制+开发)
spring boot·毕业设计·旅游·京东绿谷智慧旅游管理平台·景点推荐与旅游预订系统设计·智能化旅游推荐与信息查询系统·高效旅游资源管理与用户服务平台
吾日三省吾码3 小时前
JVM-类文件结构
后端