基于JWT的spring boot权限验证技术实现教程
作者:Tyler Yue 发布时间:2022-07-20 01:48:58
标签:jwt,认证,springboot
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


猜你喜欢
- 一、Intent的用途Intent主要有以下几种重要用途: 1. 启动Activity:可以将Intent对象传递给startActivit
- 前言相信有很多小伙伴,在日常的开发中都有遇到过需要调用第三方接口的需求吧,但是自己有没有写过接口提供给第三方使用呢,常规的都是我们调用别人的
- 我正在开发一个软键盘,做得很好,但是我不知道如何自定义一个长按键的弹出窗口.我的键盘视图:<?xml version="1.
- 前言兄弟们,刚刚又给seata社区修了一个BUG,有用户提了issue反应TransactionHook在某些情况下不会被调用:相关issu
- Android 实现记住用户名和密码的功能是通过SharedPreference 存储来实现的。创建一个复选按钮,通过按钮的否选取来进行事件
- 建造者模式针对的是复杂对象的构建,比如一个产品有多个部分构成,每个部分都可以单独进行生产,这时候就可以用建造者模式,由Builder构造产品
- 前言:Timer是一个定时器,作为C#开发Timer控件是我们用的比较多的一个控件,它的功能很简单,但是也是值得我们去学习的一个知识点,今天
- 错误示例,同一个类中使用异步方法:package com.xqnode.learning.controller;import com.fas
- 1.与过滤器filter的区别2.springMVC中 * 的必须实现的三个方法:3. * 类的编写:package com.imooc.
- 本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一
- 全面总结Android Service的使用方法,具体内容如下1、Service的种类按运行地点分类:其实remote服务还是很少见的,并且
- 把SpringBoot项目打包成Docker镜像有两种方案:全自动化:先打好docker镜像仓库,然后在项目的maven配置中配置好仓库的地
- 先看效果图:你可以定义成你项目的logo图片,可以设置水波颜色、波长、波宽、字体大小、颜色、进度条的最大值,当前进度值,还可以设置波纹震动的
- 前言在实际开发当中,Spring中bean的属性直接赋值用的不是太多,整理这方面的资料,做一个小结,以备后续更深入的学习。通过配置文件的方式
- 前言:前两天做项目的时候,想提高一下插入表的性能优化,因为是两张表,先插旧的表,紧接着插新的表,一万多条数据就有点慢了后面就想到
- 壹、入围方案Sentinelgithub地址:https://sentinelguard.io/zh-cn/docs/introductio
- 刚实现了App内手机横/竖放置时,屏幕横/竖屏的切换。记录一下中间需要的关键信息和实现过程。开门见山的说,实现屏幕自动/手动旋转的方式有两种
- 快速排序过程没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”!光听这个名字是不是就觉得很高端呢。假设我们现在对“52 39 67
- 求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转
- springboot 排除redis的自动配置因为要配置一个redis链接,所以将系统自带的配置排除,分别是RedisAutoConfigu