实现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拦截器等。

相关推荐
Java编程爱好者12 小时前
面试被问 Redis?这 3 个问题 90% 的人都答不对
后端
金牌归来发现妻女流落街头12 小时前
【Spring AMQP 三大交换机】
后端·spring
vx+_bysj686912 小时前
【免费领源码】基于springboot欣欣汽车租赁系统 计算机毕业设计项目推荐上万套实战教程JAVA,node.js,C++、python、大屏数据可视化
java·spring boot·mysql·汽车
重庆小透明12 小时前
微服务,不仅仅是“小服务”
java·后端·spring cloud·微服务·云原生·架构
孟沐12 小时前
JDBC 入门大白话文档
后端
李长渊哦12 小时前
OpenClaw 本地部署完全指南:从环境验证到启动运行
后端·arcgis
Java编程爱好者12 小时前
Spring Boot 中关于 Bean 加载、实例化、初始化全生命周期的扩展点
后端
七牛云行业应用13 小时前
别瞎折腾了!4 步排查法,手把手教你搞定 OpenClaw Skills 各种安装报错
后端·openai·agent
Java编程爱好者13 小时前
DBA 经验:MySQL性能最重要的参数只有2个!
后端
常利兵13 小时前
Spring Boot3 实战:WebSocket+STOMP+集群+Token认证,实现可靠服务器单向消息推送
服务器·spring boot·websocket