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

网友投稿 241 2022-11-14


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

JWT简介

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

实现步骤:

环境spring boot

1、添加jwt依赖

com.auth0

java-jwt

3.8.1

io.jsonwebtoken

jjwt

0.9.1

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

}

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringBoot扩展SpringMVC原理并实现全面接管
下一篇:maven多profile 打包下
相关文章

 发表评论

暂时没有评论,来抢沙发吧~