服务网关 Zuul 与 Redis 结合实现 Token 权限校验

本文介绍了如何使用Zuul服务网关结合Redis进行Token权限校验。详细阐述了登录逻辑、AuthFilter前置过滤器的实现、工具类的创建以及演示验证过程。通过登录成功后将Token存储在Redis中,并在后续请求中进行校验,确保接口的安全访问。

这两天在写项目的全局权限校验,用 Zuul 作为服务网关,在 Zuul 的前置过滤器里做的校验。

权限校验或者身份验证就不得不提 Token,目前 Token 的验证方式有很多种,有生成 Token 后将 Token 存储在 Redis 或数据库的,也有很多用 JWT(JSON Web Token)的。

说实话这方面我的经验不多,又着急赶项目,所以就先用个简单的方案。

登录成功后将 Token 返回给前端,同时将 Token 存在 Redis 里。每次请求接口都从 Cookie 或 Header 中取出 Token,在从 Redis 中取出存储的 Token,比对是否一致。

我知道这方案不是最完美的,还有安全性问题,容易被劫持。但目前的策略是先把项目功能做完,上线之后再慢慢优化,不在一个功能点上扣的太细,保证项目进度不至于太慢。

项目地址:https://github.com/cachecats/coderiver

本文将分四部分介绍

  1. 登录逻辑
  2. AuthFilter 前置过滤器校验逻辑
  3. 工具类
  4. 演示验证

一、登录逻辑

登录成功后,将生成的 Token 存储在 Redis 中。用 String 类型的 key, value 格式存储,key是 TOKEN_userId,如果用户的 userId 是 222222,那键就是 TOKEN_222222;值是生成的 Token。

只贴出登录的 Serive 代码

@Override
public UserInfoDTO loginByEmail(String email, String password) {
   
   

    if (StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
   
   
        throw new UserException(ResultEnum.EMAIL_PASSWORD_EMPTY);
    }

    UserInfo user = userRepository.findUserInfoByEmail(email);
    if (user == null) {
   
   
        throw new UserException(ResultEnum.EMAIL_NOT_EXIST);
    }
    if (!user.getPassword().equals(password)) {
   
   
        throw new UserException(ResultEnum.PASSWORD_ERROR);
    }

    //生成 token 并保存在 Redis 中
    String token = KeyUtils.genUniqueKey();
    //将token存储在 Redis 中。键是 TOKEN_用户id, 值是token
    redisUtils.setString(String.format(RedisConsts.TOKEN_TEMPLATE, user.getId()), token, 2l, TimeUnit.HOURS);

    UserInfoDTO dto = new UserInfoDTO();
    BeanUtils.copyProperties(user, dto);
    dto.setToken(token);

    return dto;
}

二、AuthFilter 前置过滤器

AuthFilter 继承自 ZuulFilter,必须实现 ZuulFilter 的四个方法。

filterType(): Filter 的类型,前置过滤器返回 PRE_TYPE

filterOrder(): Filter 的顺序,值越小越先执行。这里的写法是 PRE_DECORATION_FILTER_ORDER - 1, 也是官方建议的写法。

shouldFilter(): 是否应该过滤。返回 true 表示过滤,false 不过滤。可以在这个方法里判断哪些接口不需要过滤,本例排除了注册和登录接口,除了这两个接口,其他的都需要过滤。

run(): 过滤器的具体逻辑

为了方便前端,考虑到要给 pc、app、小程序等不同平台提供服务,token 设置在 cookie 和 header 任选一均可,会先从 cookie 中取,cookie 中没有再从 header 中取。

package com.solo.coderiver.gateway.filter;

import com.google.gson.Gson;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import com.solo.coderiver.gateway.VO.ResultVO;
import com.solo.coderiver.gateway.consts.RedisConsts;
import com.solo.coderiver.gateway.utils
内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识稳定性验证。研究深入探讨了构网型变流器传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制宽频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、宽频振荡机理研究以及撰写高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程稳定性判据应用;④利用提供的成熟模型代码加速科研进程,支撑课题研究学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。
已经博主授权,源码转载自 https://pan.quark.cn/s/82d496e9a0de Linux C/C++基础学习资料对于IT领域的初学者和开发者而言是至关重要的资源,其中包含了操作系统、编程语言以及算法等多个核心知识领域。本文将深入剖析这些主题,旨在帮助你更加透彻地领悟和掌握相关技能。 让我们从“Linux命令详解”部分开始。Linux命令行是操作系统的核心工具,精通各类命令能够显著提升开发效率。例如,“ls”用于列出目录内容,“cd”用于切换工作目录,“grep”用于在文件中检索特定文本,“vi/vim”是常用的文本编辑器,而“gcc/g++”则是C/C++的编译工具。熟悉并高效运用这些基础命令是Linux环境下编程的入门关键。 接下来是“Linux下编程环境”的配置。在Linux平台上进行C/C++程序的开发,需要安装相关的开发工具,例如GCC/G++编译器、Make构建工具、GDB调试器等。同时,理解环境变量的设置、编译链接过程、动态库静态库的运用也是搭建编程环境的重要环节。此外,掌握使用版本控制系统如Git进行代码管理,也是当代开发者不可或缺的技能。 然后是C/C++的基础知识。C++作为C语言的延伸,支持面向对象的编程范式,而C语言则是系统级编程的基础。掌握变量、数据类型、运算符、控制结构(包括if-else、for、while等)、函数、指针、数组、结构体等基本概念是C/C++学习的根本。对于C++,还需熟悉类、对象、继承、多态、模板等高级特性。 “数据结构”是编程中的核心概念,涵盖了数组、链表、栈、队列、哈希表、树(如二叉树、红黑树等)以及图等。深入理解这些数据结构的特性操作,以及它们在实际问题中的具体应用,能够有效增强解决问题的能力。...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值