我们将详细介绍如何使用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拦截器等。