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

2023-11-11

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于JWT的springboot权限验证技术实现 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • Java substring( )

    substring start stop substring start stop 用于提取从start到stop 1之间的所有字符 所取字符长度为stop start start 非负整数 开始提取字符的起始位置 必需要写 stop 非负
  • 【教程】Win10安装SQLServer2005出现服务启动失败的问题解决

    Win10安装SQLServer2005时需要注意以下几点 1 先在控制面板中安装好IIS 2 右键SQLServer2005安装文件夹中的setup exe 设置兼容模式为Win7兼容模式 且以管理员身份运行 3 安装过程中 遇到弹窗提示
  • Windows 下最实用的 Gvim 配置

    一直以来被称为编辑器之神的 vim 在 Windows 下很难发挥其强大的功能 本文从实用的角度阐述如何调校出一个比较好用的 vim 不过仍然要说明下 在众多 vim 构建版本中 Mac OS 平台的 MacVim 是我认为最好用的一个版本
  • Android基础小知识

    一 TextView的hint与wrap content 二 tools context tools text等作用 tools context tools text等不会被打包进apk 只是用来在布局时候预览渲染效果的 tools con
  • 阿里云爆发史上最严重宕机事故。。。

    阿里云香港区于2022年12月18日出现故障 多个香港和澳门的网站受到影响 包括Linux中国的官网 https linux cn 澳门金融管理局 澳门银河 莲花卫视 澳门水泥厂等关键基础设施营运者的网站 澳觅和MFood等外卖平台 以及澳
  • FileReader简介

    前言 FileReader是一种异步文件读取机制 结合input file可以很方便的读取本地文件 input file 在介绍FileReader之前 先简单介绍input的file类型
  • Chrome插件链接

    常用Chrome插件整理 其它好用的插件 欢迎大家留言分享 输入ID下载点击下载 1 已安装插件里可以查看ID 2 安装链接里面也有 https chrome google com webstore detail idm integrati
  • vivado烧录程序搜索不到设备,烧录卡住不动

    烧录程序找不到设备或者设备不可用 烧录过程卡主不动 可以排除驱动问题的前提 解决方法 1 先观察jtag的指示灯 红灯有问题 可能fpga电源未开 接口松动 观察板子的初始程序是否启动成功 如果没有启动成功 jtag指示器也会是绿的 但是搜
  • springboot 过滤器异常处理,filter exception catch

    参考地址 java How to manage exceptions thrown in filters in Spring Stack Overflow
  • 经验积累①:关于设备程序的版本迭代方案详解

    关于设备程序的版本迭代方案详解 一 案例描述 对于嵌入式应用层来说 需要对设备的很多参数进行保存 为了使得这些配置参数掉电不丢失 因此在flash中生成配置文件用于保存设备参数 每当设备重启后 将参数读出 重发给设备 由于生成了可变的配置文
  • event_base_loop

    函数 int event base loop struct event base int 等待事件被触发 然后调用它们的回调函数 这是 event base dispatch的更灵活版本 默认情况下 这个循环会一直运行 直到没有添加的事件
  • 在macOS下安装和配置MySQL数据库

    一 到社区下载安装包 官网地址 MySQL MySQL Community Downloadshttps dev mysql com downloads MySQL Download MySQL Community Serverhttps
  • 身边的逻辑学——过度概括(1)

    过度概括 overgeneralization 概括与过度概括有何不同 概括知识是暂定的 因为它基于对经验的概括 原则上 下一个经验很可能出乎你的意料之外 使你 我们每个人 不得不对先前概括得出的结论感到怀疑 了解概括的本质有助于发现真理
  • C/C++ vs2017连接MySQL数据库 - 增删改查(详细步骤)

    在开发中 数据库是必不可少 这篇文章将介绍使用C C 如何进行连接MySQL数据库 并实现增删改查操作 注意 此篇文章所讲的是C C 如何操控MySQL进行简单的 常用的 增删改查 的操作 目录 一 配置Visual Studio 二 C
  • 不可不说的Java“锁”事

    前言 Java提供了种类丰富的锁 每种锁因其特性的不同 在适当的场景下能够展现出非常高的效率 本文旨在对锁相关源码 本文中的源码来自JDK 8 使用场景进行举例 为读者介绍主流锁的知识点 以及不同的锁的适用场景 Java中往往是按照是否含有
  • ACL访问控制列表原理及实例

    目录 一 ACL概述 1 ACL访问控制列表作用 2 ACL访问控制列表工作原理 3 ACL访问控制列表处理过程原则 二 ACL访问控制列表类型 1 标准访问控制列表 2 扩展访问控制列表 三 配置实例 1 要求 用标准访问控制列表 vla
  • qt modules public internal 私有头文件 private

    qt对源码进行了分层 把数据成员都单独拉到一个 p h的头文件中 形成internal部分的接口类Qt之二进制兼容 qt p h 文件的用途是什么 qt不建议用户使用internal部分的接口类 因为不同平台和不用版本的qt interna
  • sort函数的时间、空间复杂度

    sort函数进行排序的时间复杂度为n log2n 原理 不是简单的快排 STL的sort 算法 数据量大时采用Quick Sort 分段递归排序 一旦分段后的数据量小于某个门槛 为避免Quick Sort的递归调用带来过大的额外负荷 就改用
  • Grade for Android(从 Gradle 和 AS 开始)

    http www open open com lib view open1451536597026 html 正如大家所见 这是本英文书 而由于国内的gradle翻译资料不全 所以特次开辟专栏 翻译gradle for android这本书
  • 基于JWT的springboot权限验证技术实现

    JWT简介 Json Web Token JWT JSON网络令牌 是为了在网络应用环境间传递声明而制定的一种基于JSON的开放标准 RFC 7519 JWT是一个轻便的安全跨平台传输格式 定义了一个紧凑的自包含的方式用于通信双方之间以 J