拦截器整合Redis实现登陆安全方案

拦截器整合Redis实现登陆安全方案

  1. 首先系统中任何部分不存在用户token

  2. 登陆时使用jwt产生非对称加密的token,将用户基础信息Map存储到token的payload中,随后将用户的详细信息存储到redis中,数据结构为: “用户id” :“用户详细信息(Hash)”

    //非对称token(默认6小时过期)
    HashMap<String, String> userTokenMap = new HashMap<>();
    userTokenMap.put("username", user.getUsername());
    userTokenMap.put("userId", user.getId().toString());
    String token = JWTAuth0Util.genTokenRAS(userTokenMap);/** * 创建token方法,时间设置为6小时* 根据RSA算法加密生成token【非对称】* @param payload* @return*/public static String genTokenRAS(Map<String, String> payload){//指定过期时间 【6小时】Calendar calendar = Calendar.getInstance();calendar.add(Calendar.HOUR, 2);//获取一个构建对象【静态内部类】JWTCreator.Builder builder = JWT.create();//将信息、数据(body)信息放到需要的claim里面payload.forEach((k, v) -> builder.withClaim(k, v));//通过hutool工具类来创建RSA对象RSA rsa = new RSA(PRIVATE_KEY_STR, null);//获取私钥RSAPrivateKey privateKey = (RSAPrivateKey) rsa.getPrivateKey();String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.RSA256(null, privateKey));return token;}
    
  3. 并将用户的token返回到前端,每次前端请求会将token发送到后端,后端每次接收到请求后,会在拦截器中进行拦截判断,此时进行逻辑判断:

    ​ jwt有效时间:6小时;

    ​ redis中key有效时间:6小时;

    这个地方会涉及到双重验证,

    此时通过redisTemplate向redis服务器检查redis是否存在token中我们解密payload中的userId,若存在,证明登陆状态并放行,否则将拦截。

    public class MyInterceptor implements HandlerInterceptor {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Overridepublic boolean preHandle(HttpServletRequest request, @NotNull HttpServletResponse response, Object handler) throws Exception {String authorization = request.getHeader("token");String userId = "";try {userId = JWTAuth0Util.decodedRSA(authorization).getClaim("userId").asString();} catch (Exception e) {throw new RuntimeException(e);}return Objects.equals(redisTemplate.hasKey(userId),Boolean.TRUE);}}
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis7降级6备份不过期数据操作

Redis7降级6备份不过期数据操作 搜到三种备份方法 rdb版本11-》redis7;rdb版本9-》redis6&#xff1b;不兼容&#xff0c;版本太高无第三方工具转换。其中那个rdbtool白瞎断更好久了。aof 使用aof -fix&#xff0c;文件大小没变&#xff0c;读取不了数据&#xff1b;不兼容&a…

【入门】最短路径

时间限制 : 1 秒 内存限制 : 128 MB 在带权有向图G中&#xff0c;给定一个源点v&#xff0c;求从v到G中的其余各顶点的最短路径问题&#xff0c;叫做单源点的最短路径问题。 在常用的单源点最短路径算法中&#xff0c;迪杰斯特拉算法是最为常用的一种&#xff0c;是一种按照…

黑马甄选离线数仓项目day01(项目介绍)

课程介绍 项目名称 黑马甄选数仓形式 离线数仓开发业务类型 电商业务 电商介绍 B2B B2C C2C 项目属于 新零售电商 新零售 线上(网站,app,小程序&#xff09; 线下&#xff08;实体体验店&#xff09; 物流&#xff08;自营物流&#xff09; 项目行业 果蔬生鲜领域 商业模式 B…

Flutter 中的 Text 小部件:全面指南

Flutter 中的 Text 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;Text 是用于显示文本的基础小部件。它不仅简单易用&#xff0c;而且提供了丰富的定制选项&#xff0c;包括样式、对齐、行间距等。本文将详细介绍如何使用 Text 小部件&#xff0c;并探索其高级特性。…

网络面试题目

1、BGP报文有哪些? 有5种报文,Open、 Update、 Notification、 Keepalive和 Route-refresh等5种报文类型。 2、Vxlan了解多少? VLAN作为传统的网络隔离技术,VXLAN完美地弥补了VLAN的上述不足。 VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),(VXL…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《规模化屋顶光伏接入配电网的建设决策》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

数据结构之----线性表

线性表分为 顺序存储结构 和 链式存储结构 线性表的顺序存储结构&#xff1a; 线性表的顺序存储结构&#xff0c;指的是用一段地址连续的存储单元依次存储线性表的数据元素。 1&#xff0c;顺序表的结构&#xff1a; #define MAXSIZE 20 typedef int El…

scrapy crawl时报Unknown command: crawl

Scrapy 项目初始化问题&#xff1a;在运行 scrapy crawl 命令之前&#xff0c;你需要先在项目目录中初始化一个 Scrapy 项目。确保你已经在项目目录中执行了 scrapy startproject <project_name> 命令来初始化项目。 如果没有startproject直接genspider然后crawl就会报这…

数据结构---经典链表OJ

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

css基础之用户界面样式、导航栏和三角

用户界面样式 一、鼠标样式cursor default默认 pointer小手 move移动 text文本 not-allowed禁止 二、轮廓线outline 去掉轮廓线 1.outline: 0; 2.outline: none; 三、防止拖拽文本域resize resize: none; 四、vertical-align 实现图片与表单&#xff08;行内块元素&…

C# SHA3-224加密

打开你的.NET项目。 右键点击解决方案资源管理器中的项目&#xff0c;选择“管理NuGet包”。 在NuGet包管理器中&#xff0c;点击“浏览”选项卡。 搜索“BouncyCastle”包&#xff0c;然后点击“安装”。 等待安装完成。 using Org.BouncyCastle.Crypto.Digests; using Or…

【VSCode】 使用 Prettier 插件格式代码时 如何避免将 大写PX 转为 小写px

【方法1】 setting.json 文件中添加代码 "vetur.format.defaultFormatter.css": "none","vetur.format.defaultFormatter.scss": "none","vetur.format.defaultFormatter.less": "none","[vue]": {&qu…

7个开发者必须知道的Nodejs 设计模式

好的&#xff0c;我已经收到了完整的内容&#xff0c;我将开始翻译。 设计模式是解决日常软件设计问题所必需的。这些问题可能包括&#xff1a; 维护数据库连接创建和管理对象通知一组订阅了特定实体的用户。 如果你试图自己想出解决方案&#xff0c;你很可能需要花费大量精…

数据结构(五)什么是算法

数据结构&#xff08;五&#xff09;什么是算法 要点&#xff1a;算法是一种指令集&#xff0c;有限且不依赖于某一种程序语言 思考&#xff1a;算法为什么是一种思想 01 算法的定义 一个有限指令集接收一些输入&#xff08;有些情况下不需要输入&#xff09;产生输出&…

使用 CloudFlare 后如何才能不影响搜索引擎蜘蛛爬虫

今天,明月给大家再次详细讲解一下,明月在使用 CloudFlare 后如何才能不影响搜索引擎蜘蛛爬虫对站点的抓取,因为这是很多首次使用 CloudFlare 的站长们容易忽略和触犯的问题,并不是 CloudFlare 不友好,而是 CloudFlare 的防火墙(WAF)实在是太给力。其实在【CloudFlare 如…

java项目之共享汽车管理系统(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的共享汽车管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 共享汽车管理系统的主要…

为什么推荐将 IoTDB 服务地址配置为 HostName 而非 IP?

设置主机名启动 IoTDB 可在不修改配置情况下&#xff0c;在不同环境运行 IoTDB 并实现多次部署。 01 前言 IoTDB 在配置启动时有两种方式&#xff1a; 1. 通过设置 HostName&#xff08;主机名&#xff09;的方式来启动 IoTDB&#xff08;推荐方式&#xff09;&#xff1b; 2. …

lua 判断字符串是否包含子字符串(点符号查找)

一、string.find 方法 lua代码 function containsDot(str) local pos string.find(str, ".") if pos then return true else return false end end -- 测试函数 local testString1 "hello.world" local testString2 "helloworld&quo…

SpringBoot集成jasypt对yml文件指定参数加密并自定义@bean隐藏密钥

1、查看SpringBoot和jasypt对应版本。 Jasypt 1.9.x 通常与 Spring Boot 1.5.x 相对应。 Jasypt 2.1.x 通常与 Spring Boot 2.0.x 相对应。 Jasypt 3.x 通常与 Spring Boot 2.1.x相对应。 2、引入maven <dependency><groupId>com.github.ulisesbocchio</groupI…

CSS - 选择器

目录 一、CSS的基本语法格式&#xff1a; 二、常见的CSS选择器 ​编辑1.标签选择器 2.类选择器 3.id选择器 4.复合选择器 5.通用选择器 三、常见的CSS样式 1.color 2.font-size 3.border 4.width/height 5.padding 6.margin 四、CSS的引入方式 1.行内引入 …