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

相关推荐
何政@44 分钟前
Web后端开发原理!!!什么是自动配置???什么是起动依赖???
java·spring boot·spring
计算机学姐1 小时前
基于SpringBoot+Vue的旅游攻略平台管理系统
java·vue.js·spring boot·后端·intellij-idea·mybatis·旅游
java—大象2 小时前
基于JavaWeb开发的Java+SpringMvc+vue+element实现驾校管理系统详细设计
java·前端·vue.js·spring boot·mybatis·课程设计
向上的车轮3 小时前
ASP.NET Zero是什么?适合哪些业务场景?
后端·asp.net·多租户支持
knoci5 小时前
【Go】-基于Gin框架的IM通信项目
开发语言·后端·学习·golang·gin
南浔Pyer5 小时前
AI驱动的Java开发框架:Spring AI Alibaba实战部署教程
java·人工智能·spring boot·spring·maven·idea
高高要努力7 小时前
SpringBoot日志集成-LogBack
spring boot·后端·logback
小周不摆烂8 小时前
【艾思科蓝】Spring Boot实战:零基础打造你的Web应用新纪元
spring boot
Pandaconda9 小时前
【计算机网络 - 基础问题】每日 3 题(二十七)
开发语言·经验分享·笔记·后端·计算机网络·面试·职场和发展
Pandaconda9 小时前
【计算机网络 - 基础问题】每日 3 题(二十四)
开发语言·经验分享·笔记·后端·计算机网络·面试·职场和发展