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

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

引入依赖坐标

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

<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令牌。

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,处理用户注册和登录请求。

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,处理用户的注册和登录逻辑。

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操作。

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);
}

异常处理

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

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.引入依赖坐标

<!--校验注解-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.使用方式
在这里插入图片描述

总结

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

相关推荐

  1. springboot项目jwt认证鉴权(企业级实现方案)

    2024-06-12 03:42:06       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 03:42:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 03:42:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 03:42:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 03:42:06       18 阅读

热门阅读

  1. 中继器简介

    2024-06-12 03:42:06       8 阅读
  2. 【MySQL】(基础篇一)—— SQL介绍和前置知识

    2024-06-12 03:42:06       5 阅读
  3. BGP宣告+自动汇总问题

    2024-06-12 03:42:06       6 阅读
  4. 2024.6.11

    2024-06-12 03:42:06       8 阅读
  5. 爬虫案例实战

    2024-06-12 03:42:06       6 阅读
  6. 6、Spring之Bean生命周期~创建Bean(2)

    2024-06-12 03:42:06       7 阅读
  7. python-Bert(谷歌非官方产品)模型基础笔记0.1.099

    2024-06-12 03:42:06       8 阅读
  8. 游戏心理学Day11

    2024-06-12 03:42:06       11 阅读
  9. 【Python】(一)复习重点——控制流

    2024-06-12 03:42:06       10 阅读
  10. C++杂记

    2024-06-12 03:42:06       12 阅读
  11. 主题切换之CSS文件篇

    2024-06-12 03:42:06       6 阅读