尚品汇-网关过滤用户请求、登录流程(三十五)

目录:

(1)用户认证与服务网关整合

(2)server-gateway网关配置  

(3)在服务网关中判断用户登录状态

(4)登录流程

(1)用户认证与服务网关整合

 实现思路

  1. 所有请求都会经过服务网关,服务网关对外暴露服务,不管是api异步请求还是web同步请求都走网关,在网关进行统一用户认证
  2. 既然要在网关进行用户认证,网关得知道对哪些url进行认证,所以我们得对url制定规则
  3. Web页面同请求(如:*.html),我采取配置白名单的形式,凡是配置在白名单里面的请求都是需要用户认证的(注:也可以采取域名的形式,方式多多)
  4. Api接口异步请求的,我们采取url规则匹配,如:/api/**/auth/**,如凡是满足该规则的都必须用户认证

redis:

  host: 192.168.200.129

  port: 6379

  database: 0

  timeout: 1800000

  password:

 

authUrls:

  url: trade.html,myOrder.html,list.html

(2)server-gateway网关配置  

pom.xml

<dependency>

   <groupId>org.springframework.boot</groupId>

   <artifactId>spring-boot-starter-data-redis-reactive</artifactId>

</dependency>

在网关中添加redis的配置类。

注意需要引入RedisConfig配置类:因为这个模块没有扫描service-util

server-gateway 项目中添加一个过滤器

ResultCodeEnum :

package com.atguigu.gmall.common.result;import lombok.Getter;/*** 统一返回结果状态信息类**/
@Getter
public enum ResultCodeEnum {SUCCESS(200,"成功"),FAIL(201, "失败"),SERVICE_ERROR(2012, "服务异常"),ILLEGAL_REQUEST( 204, "非法请求"),PAY_RUN(205, "支付中"),LOGIN_AUTH(208, "未登陆"),PERMISSION(209, "没有权限"),SECKILL_NO_START(210, "秒杀还没开始"),SECKILL_RUN(211, "正在排队中"),SECKILL_NO_PAY_ORDER(212, "您有未支付的订单"),SECKILL_FINISH(213, "已售罄"),SECKILL_END(214, "秒杀已结束"),SECKILL_SUCCESS(215, "抢单成功"),SECKILL_FAIL(216, "抢单失败"),SECKILL_ILLEGAL(217, "请求不合法"),SECKILL_ORDER_SUCCESS(218, "下单成功"),COUPON_GET(220, "优惠券已经领取"),COUPON_LIMIT_GET(221, "优惠券已发放完毕"),;private Integer code;private String message;private ResultCodeEnum(Integer code, String message) {this.code = code;this.message = message;}
}
package com.atguigu.gmall.gateway.filter;@Component
public class AuthGlobalFilter implements GlobalFilter{@Autowiredprivate RedisTemplate redisTemplate;// 匹配路径的工具类private AntPathMatcher antPathMatcher = new AntPathMatcher();//获取nacos配置文件中的配置@Value("${authUrls.url}")private String authUrls;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取到请求对象ServerHttpRequest request = exchange.getRequest();// 获取UrlString path = request.getURI().getPath();// 如果是内部接口,则网关拦截不允许外部访问!if (antPathMatcher.match("/**/inner/**",path)){ServerHttpResponse response = exchange.getResponse();return out(response,ResultCodeEnum.PERMISSION);}// 获取用户IdString userId = getUserId(request);//token被盗用if("-1".equals(userId)) {ServerHttpResponse response = exchange.getResponse();return out(response,ResultCodeEnum.PERMISSION);}// 用户登录认证//api接口,异步请求,校验用户必须登录if(antPathMatcher.match("/api/**/auth/**", path)) {if(StringUtils.isEmpty(userId)) {ServerHttpResponse response = exchange.getResponse();return out(response,ResultCodeEnum.LOGIN_AUTH);}}// 验证urlfor (String authUrl : authUrls.split(",")) {// 当前的url包含登录的控制器域名,但是用户Id 为空!if (path.indexOf(authUrl)!=-1 && StringUtils.isEmpty(userId)){ServerHttpResponse response = exchange.getResponse();//303状态码表示由于请求对应的资源存在着另一个URI,应使用重定向获取请求的资源response.setStatusCode(HttpStatus.SEE_OTHER);//设置地址location   originUrl当前请求的地址   response.getHeaders().set(HttpHeaders.LOCATION,"http://www.gmall.com/login.html?originUrl="+request.getURI());// 重定向到登录return response.setComplete();}}//存储userId到请求中// 将userId 传递给后端if (!StringUtils.isEmpty(userId)){request.mutate().header("userId",userId).build();// 将现在的request 变成 exchange对象return chain.filter(exchange.mutate().request(request).build());}return chain.filter(exchange);}/*** 获取当前登录用户id* @param request* @return*/
//public static String getUserId(HttpServletRequest request) {
//    String userId = request.getHeader("userId");
//    return StringUtils.isEmpty(userId) ? "" : userId;
// }

(3)在服务网关中判断用户登录状态

在网关中如何获取用户信息:

  1. 从cookie中获取(如:web同步请求)
  2. 从header头信息中获取(如:异步请求)

如何判断用户信息合法:

登录时我们返回用户token,在服务网关中获取到token后,我在到redis中去查看用户id,如果用户id存在,则token合法,否则不合法,同时校验ip,防止token被盗用。

 

/*** 获取当前登录用户id* @param request* @return*/
private String getUserId(ServerHttpRequest request) {String token = "";//头信息List<String> tokenList = request.getHeaders().get("token");if(null  != tokenList) {token = tokenList.get(0);} else {//从cookie中获取MultiValueMap<String, HttpCookie> cookieMultiValueMap =  request.getCookies();HttpCookie cookie = cookieMultiValueMap.getFirst("token");if(cookie != null){token = URLDecoder.decode(cookie.getValue());}}//获取数据if(!StringUtils.isEmpty(token)) {//从Redis中获取String userStr = (String)redisTemplate.opsForValue().get("user:login:" + token);//转换 JSONObject userJson = JSONObject.parseObject(userStr);//获取ipString ip = userJson.getString("ip");//获取请求的ipString curIp = IpUtil.getGatwayIpAddress(request);//校验token是否被盗用if(ip.equals(curIp)) {return userJson.getString("userId");} else {//ip不一致return "-1";}}return "";
}

 

输入信息out 方法

// 接口鉴权失败返回数据
private Mono<Void> out(ServerHttpResponse response,ResultCodeEnum resultCodeEnum) {// 返回用户没有权限登录Result<Object> result = Result.build(null, resultCodeEnum);byte[] bits = JSONObject.toJSONString(result).getBytes(StandardCharsets.UTF_8);//获取DataBuffer DataBuffer wrap = response.bufferFactory().wrap(bits);//乱码处理response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");// 输入到页面return response.writeWith(Mono.just(wrap));
}

当退出登录后,点击 

跳转到登录页面

登录后:

会跳转到点击的页面

后面就可以用了

(4)登录流程

 

 

退出:

 

网关中的过滤器:如果有多个过滤器可以实现Order,执行过滤器的执行顺序,谁的越小谁就先执行

 

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

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

相关文章

百度 测试|测试开发 面试真题|面经 汇总

百度测开 开发测试工程师 提前批一二三面面经 事业群&#xff1a;MEG base&#xff1a;北京 一面&#xff1a;2022.8.12 时长&#xff1a;50min 自我介绍 个人项目&#xff0c;我的项目是围绕着学校课程的项目来的&#xff0c;面试官就让我介绍这门课讲了些什么 &#xf…

构建实时数据仓库:流式处理与实时计算技术解析

目录 一、流式处理 请求与响应 批处理 二、实时计算 三、Lambda架构 Lambda架构的缺点 四、Kappa架构 五、实时数据仓库解决方案 近年来随着业务领域的不断拓展&#xff0c;尤其像互联网、无线终端APP等行业应用的激增&#xff0c;产生的数据量呈指数级增长&#xff0c;对海量数…

前端开发攻略---彻底弄懂跨域解决方案

目录 1、浏览器的同源策略 1.1 源 1.2 同源与非同源 1.3 同源请求与非同源请求 2、跨域受到的限制 3、注意点 4、CORS解决Ajax跨域问题 4.1 CORS概述 4.2 CORS解决简单请求跨域 4.3 简单请求与复杂请求 4.4 CORS解决复杂请求跨域 4.5 借助CORS库快速完成配置 5、JS…

计算机毕业设计选什么题目好? springboot java沉浸式戏曲文化体验系统

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

【生物特征识别论文分享】基于深度学习的掌纹掌静脉识别

&#xff08;待更新&#xff09;基于深度学习的生物特征识别&#xff08;手掌静脉、手背静脉、手指静脉、掌纹、人脸等&#xff09;论文模型总结 。具体方法包括&#xff1a;基于特征表征、基于传统网络设计与优化、基于轻量级网络设计与优化、基于Transformer设计与优化、基于…

ES与MySQL数据同步实现方式

1.什么是数据同步: 1.Elasticsearch中的酒店数据来自于mysql数据库&#xff0c;因此mysql数据发生改变时&#xff0c;Elasticsearch也必须跟着改变&#xff0c;这个就是Elasticsearch与mysql之间的数据同步 2.数据同步实现方式&#xff1a; 常见的数据同步方案有三种&#x…

7.2 算法设计与分析

分治法&#xff08;考的概率较低&#xff09; 回溯法&#xff08;考的概率较低&#xff09; 动态规划法&#xff08;考的概率较高&#xff09; 1

Python 办公自动化 处理 Excel 数据 【1】推荐

话说学好办公自动化,走遍天下都不怕&#xff01;&#xff01;&#xff01; 好的&#xff0c;现在开始。 因为是一些办公自动化的应用场景&#xff0c;所以需要电脑支持excel、word和ppt以及python的运行环境。 如果有电脑不支持Excel word ppt的以及python环境下载安装配置可…

交通感知与车路协同系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

QT:事件机制

一、事件机制 qt的核心机制&#xff1a;对象树、信号和槽、事件机制 1.1概念 就是当这件事情发生时&#xff0c;自动执行对应的功能代码。该某块功能代码是虚函数&#xff0c;只需重写该虚函数&#xff0c;即可执行重写的代码。 1.2事件处理简介 1. 什么是事件&#xff1f; (重…

【教学类-76-01】20240820书包01(图案最大化)

背景需求 通义万相生成图片&#xff0c;把图案最大化的方法&#xff08;切掉白边&#xff09; 【教学类-75-01】20240817“通义万相图片最大化透明png”的修图流程-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞56次&#xff0c;收藏17次。【教学类-75-01】20240817“通义万相…

【Android 笔记】记移植OpenCV4.8图像人脸识别

前言 因业务需要&#xff0c;使用大屏端摄像头捕获图像&#xff0c;且要识别图像中人脸的数目以及从中随机抽取一人。 业务流程如下&#xff0c;调用摄像头预览、拍照&#xff0c;使用OpenCV库进行人脸识别&#xff0c;将识别到的人脸使用矩形框绘制出来&#xff0c;从识别的人…

【秋招笔试】8.18大疆秋招(第三套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

STM32CubeMX 配置串口通信 HAL库

一、STM32CubeMX 配置串口 每个外设生成独立的 ’.c/.h’ 文件 不勾&#xff1a;所有初始化代码都生成在 main.c 勾选&#xff1a;初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。 二、重写fputc函数 ​ #include <stdio.h>#ifdef __GNUC__#def…

无人机之固定翼无人机的组成

固定翼无人机是根据空气动力学原理设计机翼的形状&#xff0c;靠动力装置产生推力或者拉力&#xff0c;使无人机获得一定速度后&#xff0c;会导致空气在飞机上下表面的压力不同&#xff0c;进而产生升力&#xff0c;其升力主要来源于固定的机翼。大多数都是由机翼、机身、尾翼…

FastHTML:使用 Python 彻底改变 Web 开发

什么是 FastHTML&#xff1f;&#x1f310; FastHTML 是一个现代 Python Web 应用程序框架&#xff0c;其真正目的是让 Python 开发人员轻松进行 Web 开发。它大大减少了对 JavaScript 和 CSS 构建交互式和可扩展 Web 应用程序的依赖。FastHTML 通过使用 Python 对象来表示 HTM…

python 捕获异常

捕获指定异常 e 是保存的异常信息 捕获多个异常

全国大学生数学建模比赛——时间序列(详细解读)

全国大学生数学建模比赛中&#xff0c;时间序列分析是一种重要的方法。以下是对时间序列在该比赛中的详细解读&#xff1a; 一、时间序列的概念 时间序列是按时间顺序排列的一组数据。在数学建模中&#xff0c;时间序列数据通常反映了某个现象随时间的变化情况。例如&#xf…

使用vs配置opencv环境(属性表方法)

opencv官网&#xff1a;https://opencv.org/releases/ 老手回忆&#xff08;新建属性表&#xff09; Step1: 安装VS&#xff0c;安装openCV Step2: 新建项目&#xff0c;新建项目属性表&#xff0c;debug|x64新建属性&#xff0c;命好名字 Step3: VC目录-包含目录中添加: 安装…

经典游戏,用java实现的坦克大战小游戏

今天给大家分享一个使用java编写的坦克大战小游戏&#xff0c;整体还是挺好玩的&#xff0c;通过对这款游戏的简单实现&#xff0c;加深对java基础的深刻理解。 一、设计思路 1.坦克大战小游戏通过java实现&#xff0c;其第一步需要先绘制每一关对应的地图&#xff0c;地图包括…