基于JWT的springboot权限验证技术实现

177 阅读2分钟

JWT简介

Json Web Token(JWT):JSON网络令牌,是为了在网络应用环境间传递声明而制定的一种基于JSON的开放标准((RFC 7519)。JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式用于通信双方之间以 JSON 对象行使安全的传递信息。因为数字签名的存在,这些信息是可信的。

实现步骤:

环境spring boot

1、添加jwt依赖
 <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.8.1</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

2、在src下创建annotation包

​ 新建自定义注解类 JwtToken

package com.qf.tyleryue_one.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解:方法前 表示方法需要拦截
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface JwtToken {
}

3、在src下创建utils包

​ 新建自定义JwtUtils工具类

package com.qf.tyleryue_one.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import jdk.internal.org.objectweb.asm.TypeReference;

import java.util.Date;

/**
 * 用来生成签名,校验签名,通过签名
 */
public class JwtUtils {
    //令牌有效时间
    private final static long EXPIRE_TIME=5*60*1000;
    //密钥
    private final static String SECRECT="Tyler_Yue_key";
    /**
     * 创建令牌
     */
    public  static  String sign(String userId){
        //构建失效时钟
        Date exipre_date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        //创建令牌
        JWTCreator.Builder builder = JWT.create();
        //给jwt令牌playload中放入发令牌放的用户
        //给userid用户发令牌
        builder.withAudience(userId);
        //设置令牌失效时间
        builder.withExpiresAt(exipre_date);
        //对令牌密钥进行加密
        Algorithm algorithm = Algorithm.HMAC256(SECRECT);
        String sign = builder.sign(algorithm);
        return  sign;//返回令牌
    }
    /**
     * 验证令牌
     */
    public  static boolean verifyToken(String token){

        try {
            //生成校验器
            Algorithm algorithm = Algorithm.HMAC256(SECRECT);
            //校验
            JWTVerifier build = JWT.require(algorithm).build();
            //无异常则校验成功
            return  true;
        } catch (Exception e) {
            throw  new RuntimeException("令牌过期");
        }

    }
}

4、在src下新建vo包

封装一个返回用户带令牌的 对象

package com.qf.tyleryue_one.vo;

import com.alibaba.druid.filter.AutoLoad;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 封装一个返回 含令牌的用户对象
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TokenVo {
    //用户名
    private  String usernaem;
    //令牌名
    private String token;
}

5、举例controller层用户登录业务登录带令牌
package com.qf.tyleryue_one.controller;

import com.qf.tyleryue_one.entity.VueUser;
import com.qf.tyleryue_one.service.VueUserService;
import com.qf.tyleryue_one.utils.JwtUtils;
import com.qf.tyleryue_one.vo.Msg;
import com.qf.tyleryue_one.vo.TokenVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

/**
 * 登录业务
 */
@Controller
public class VueUserController {
    @Autowired
    private VueUserService vueUserService;

    @RequestMapping(value = "/dealLogin",method = RequestMethod.POST)
    @CrossOrigin
    @ResponseBody
    public Msg login(@RequestBody VueUser vueUser){
        VueUser vueUser1 = vueUserService.selectByUsername(vueUser.getUsername());

        if (vueUser1!=null){
            if (vueUser1.getPassword().equals(vueUser.getPassword())){
                //密码匹配,发放令牌
                ///随机生成字符串未userid
                String userid = UUID.randomUUID().toString();
                String token = JwtUtils.sign(userid);
                //封装令牌对象
                TokenVo tokenVo = new TokenVo(vueUser.getUsername(), token);
                return new Msg(200,"登录成功,令牌已发放",tokenVo);

            }else {
                return  new Msg(403,"密码错误",null);
            }
        }else {
            return new Msg(403,"用户不存在",null);
        }
    }
}

结尾

希望对大家有帮助,如果喜欢的话记得点赞加关注哦