- 紧接着上一次的博客,我们现在来给这个项目添加一个jwt的权限验证功能,上一次的博客如下:
- springboot结合vue实现登录和注册功能-CSDN博客
1.后端
1.1.导入依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.3.0</version>
</dependency>
1.2.编写jwt的拦截器
这个类实现一个HandlerInterceptor接口,这个类主要完成以下几个任务:
- 从请求头里获取token,没有获取到就抛异常(注意:请求头里原本是没有token的,这个需要我们自己在前端添加一个token)
- 解码token并从token里获取用户ID,没有获取到就抛异常,表明token里没有数据(注意:这个用户ID是自己在前端添加token时存储的)
- 通过用户密码来生成一个验证器,解析token(JWT一般含有三个部分,头部,荷载,签名,解析过程中jwtVerifier会检验这三部分能不能正常分离,以及来用验证器来验证签名,以及检查token的过期时间)这一步也是最重要的一步!
package com.kuang.common;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.kuang.exception.ServiceException;
import com.kuang.mapper.UserMapper;
import com.kuang.pojo.User;
import io.micrometer.common.util.StringUtils;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class JwtInterceptor implements HandlerInterceptor {
@Resource
private UserMapper userMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//从请求头Header里接收传来的参数token
String headerToken = request.getHeader("token");
//如果传来的token为空,则从url参数中来接收传来的token
if(StringUtils.isBlank(headerToken)){
headerToken = request.getParameter("token");
//如果url里的token为空,则抛异常
}
if (StringUtils.isBlank(headerToken)){
throw new ServiceException("401","请登录");
}
//从token中获取userId
//JWT.decode(headerToken) 解码JTW