基于JWT的spring boot权限验证技术实现教程

作者:Tyler Yue 时间:2022-07-20 01:48:58 

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

来源:https://blog.csdn.net/qq_43137699/article/details/109368386

标签:jwt,认证,springboot
0
投稿

猜你喜欢

  • Springcloud Nacos基本操作代码实例

    2023-07-07 18:24:22
  • 微信开发--自定义菜单查询返码乱码的解决方法

    2023-11-25 04:47:55
  • java开发线上事故理解RocketMQ异步精髓

    2023-07-25 07:41:20
  • Servlet3.0学习总结之基于Servlet3.0的文件上传实例

    2023-09-02 01:51:33
  • 深入理解Javascript中的this关键字

    2022-03-08 16:52:25
  • JAVA调用SAP WEBSERVICE服务实现流程图解

    2023-11-07 03:54:57
  • Spring Cloud Ribbon配置详解

    2023-11-25 01:32:50
  • MyBatis-Plus 查询返回实体对象还是map

    2023-11-28 03:20:19
  • Android ContentProvider实现获取手机联系人功能

    2023-08-07 00:52:27
  • Spring Boot教程之利用ActiveMQ实现延迟消息

    2023-11-23 18:25:09
  • java compare compareTo方法区别详解

    2022-06-26 08:13:55
  • Java中Steam流的用法详解

    2021-12-16 14:18:50
  • Spring Boot常用注解(经典干货)

    2023-11-24 22:29:10
  • Java线程的全方位详解

    2023-04-11 14:02:55
  • 学习Java HashMap,看这篇就够了

    2023-11-11 11:18:56
  • Java中避免过多if-else的几种方法

    2023-11-28 13:07:09
  • Java使用substring()截取(提取)子字符串

    2023-09-29 17:02:04
  • Java的封装类和装箱拆箱详解

    2023-09-20 22:41:22
  • Qt之调用C#的动态库的解决方法

    2023-07-22 03:42:45
  • 图文详解Maven工程打jar包的N种方式

    2022-12-12 21:36:23
  • asp之家 软件编程 m.aspxhome.com