《企业微服务实战 · 接口鉴权思路分享》

news2024/11/15 15:47:49

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • 接口鉴权实战
      • 鉴权设计
      • 后端实现
      • 前端改造
      • 其他考虑
    • 总结陈词

CSDN.gif

写在前面的话

博主所在公司,后端技术栈为SpringCloudAlibaba,前端为Vue/Nuxt,现新开本系列博文,以此技术栈为例,介绍企业在前后端分离和微服务开发模式下的相关实战过程分享。
接口鉴权是所有框架中,必须考虑的一个环节,本系列博文也以此开篇。


接口鉴权实战

鉴权设计

博主所在公司整体采用前后端分离+微服务架构,所有业务系统,拥有一个统一工作门户,用户管理整体的登录入口,通过单点登录SSO机制,实现各业务系统的免登录,“一次登录、到处运行”,当然本篇文章主要不是介绍SSO的,先聊一下“接口鉴权”的那些事情。

【设计流程如下】
用户登录门户后,门户认证模块会将用户 Token 存储到 Redis,后续接口调用将验证请求头是否携带Token,并对Token 做二次验证,如果验证通过会将用户信息放入请求头中,可以通过用户信息工具类获取相应用户信息。反之,验证不通过则予以报错。

【简单流程图】
image.png

后端实现

【实现鉴权】
后端要实现接口鉴权,通常可以采用过滤器和拦截器,如果有不清楚的,可以再看看之前的博文《知识点扫盲 · 过滤器 Filter》和《知识点扫盲 · 拦截器 Interceptor》。
具体添加鉴权的环节通常也有两种:1、网关Gateway直接校验;2、框架核心公用包添加校验;
两种方式各有优缺点,博主所在公司采用第二种方案。
实现思路大体:

  1. 核心包内自定义实现拦截器,例如TokenInterceptor;
  2. 该拦截的preHandle方法内,获取请求头的token信息,判断是否需要校验以及是否为空;
  3. 继续从Redis中获取该Token的用户信息,存在则设置到请求头内,为空则给予异常;

【登录改造】
门户登录成功后,应该会生成一个唯一的Token代,并且存储到Redis中,Key是Token,Value是用户信息,同时返回相关信息给前端。


前端改造

登录成功后,前端本地缓存会存储 lw_token 和 lw_userInfo 两个信息。
lw_token 存储 token 信息,后端可以根据它从 Redis 中拿到用户信息;
lw_userInfo 存储用户请求头信息,部分信息如下。
存本地缓存的目的是,方便所有业务系统可以快速查阅。

//以下数据仅为范例
{
    "districtCode": "1", 
    "staffNo": "4129", 
    "districtName": "", 
    "orgCode": "46667016-1", 
    "name": "门户", 
    "language": "zh", 
    "operator": "4129", 
    "userCode": "9113"
}

【前端验证流程】
所有前端请求后端接口处(Axios封装模块),都会先校验这两个参数是否存在,不存在前端则直接报错。
之后会在请求头携带 lw_token,网关层会针对请求的 lw_token 做二次校验(也可以是LwToken),若不存在则抛出异常。
网关解析 Lw_token 后,可以拿到用户信息放入请求头,后续所有服务都可以拿到相应请求头(包括Feign调用的后续接口)。

其他考虑

【如何关闭鉴权】
下方是一些鉴权配置项,仅供参考。

lw:
  auth:
    # 是否开启Token验证 (默认开启)
    enabled: false
    # 是否验证请求时间 (默认关闭)
    validate-call-time: false
    # callTime有效期 (s=秒,m=分钟,h=小时,d=天) (默认2分钟内的请求有效)
    call-time-expiration: 3m
    # 白名单列表,跳过验证(支持Spring通配符)
    permit-urls:     
      - /demo/test1/**
      - /demo/*/test2
      - /demo/test3

【有效期设计】
由于Token存在在Redis中,而且属于高频生成量,建议要添加上有效期。
否则久而久之会影响Redis性能。

【Feign调用鉴权】
不止前端访问后端,后端之间的Feign调用也可以考虑一下是否鉴权。
这里篇幅限制,不展开赘述,后续可以专栏介绍。


总结陈词

此篇文章介绍了接口鉴权 在企业实战中如何实现,仅供学习参考。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif

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

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

相关文章

ES JavaApi

1.RestClient操作索引库 2.RestClient操作文档 2.1查询 2.2更新 2.3删除 2.4批量新增(bulk) 3.DSL查询 对应的api 3.0解析响应 3.1全文检索 3.2精确查询 3.3复合查询-boolQuery 构建boolQuery 3.4排序和分页 3.5高亮

浙大数据结构慕课课后题(06-图2 Saving James Bond - Easy Version)(拯救007)

题目要求: This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake fi…

C++打怪小游戏

这是一款用C代码写出来的打怪游戏。 上图片👇 ![](https://i-blog.csdnimg.cn/direct/6a4497c784ff4ba7a3332bc97d433789.png 一个11岁小朋友,爆肝532行,11小时完成代码,内部14个函数,5个结构体,三连…

ffmpeg使用x11录屏

version #define FFMPEG_VERSION "6.1.1" note x11视频采集结构:AVInputFormat ff_xcbgrab_demuxer code void CFfmpegOps::CaptureVideo(const char *outFileName) {const AVInputFormat *iFmt nullptr;size_t n 0;AVFormatContext *iFmtCtx nullptr;AVDict…

三十九、大数据技术之Kafka3.x(2)

🌻🌻 目录 一、Kafka 生产者1.1 生产者消息发送流程1.1.1 发送原理1.1.2 生产者重要参数列表 1.2 异步发送API1.2.1 普通异步发送1.2.2 带回调函数的异步发送 1.3 同步发送 API1.4 生产者分区1.4.1 分区好处1.4.2 生产者发送消息的分区策略1.4.3 自定义分…

使用Leaks定位iOS内存泄漏问题并解决

使用Leaks定位iOS内存泄漏问题并解决 前言 内存泄漏问题一直是程序开发中最令人头疼的问题,特别是C/C。虽然C/C在C11之后引入了许多新特性,包括智能指针,自动类型推导等,但C中动态内存的分配和释放仍然需要程序员来显式地进行。…

Linux线程thread详解(线程池)

在我们的进程虚拟地址的代码区,对于代码中的每个函数都有对应的地址,每个函数中的每行代码都有对应的代码,并且每个函数中的每行代码的地址都是连续的。既然代码是连续的,也就意味着我们可以将我们代码分块,分成不同的…

机器学习笔记:序列到序列学习[详细解释]

介绍 本节我们使用两个循环神经网络的编码器和解码器, 并将其应用于序列到序列(sequence to sequence,seq2seq)类的学习任务。遵循编码器-解码器架构的设计原则, 循环神经网络编码器使用长度可变的序列作为…

Jeecgboot3.6.3的vue3版本的一种flowable动态增加一个用户任务节点的方法(二)前端代码实现

因为这个项目license问题无法开源,更多技术支持与服务请加入我的知识星球。 这部分主要讲前端的功能实现 1、前端选择新增任务类型界面,点击新增节点 /*** 动态新增用户任务节点*/function handleAddTask(record: Recordable) {if (record.finishTime != null) {createMess…

在 .NET 8.0 中使用 xUnit 进行数据驱动测试

1. 前言 xUnit是一个功能强大且易于使用的单元测试框架。在.NET开发中,单元测试是非常重要的一部分,它可以帮助我们确保代码的正确性和可靠性。使用xUnit可以帮助我们编写更高效、更有效的单元测试,并提高代码质量和可维护性。 2. 特性 x…

Git-GitLab-Jenkins结合

目录 1.Git-GitLab-Jenkins结合2. 在pycharm配置git3. 实现提交代码后触发自动化测试(1)打开gitlab(2)Jenkins配置Git(3)选择需要的远程仓库 4.报告存在问题:5.也可以在Jenkins中设置定时触发&a…

OpenCV图像滤波(10)Laplacian函数的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 功能描述 计算图像的拉普拉斯值。 该函数通过使用 Sobel 运算符计算出的 x 和 y 的二阶导数之和来计算源图像的拉普拉斯值: dst Δ src ∂…

Elasticsearch:引入 Serverless 精简索引分片

作者:来自 Elastic Tanguy Leroux 在本文中,我们将介绍 Elasticsearch 的精简索引分片(thin indexing shards),这是我们为 Elastic Cloud Serverless 开发的一种新型分片,允许将 Elasticsearch 索引存储在云…

大数据技术现场工程师特色实训室解决方案

一、引言 在大数据时代背景下,数据已成为新的生产要素,驱动着各行各业的创新发展。面对这一趋势,市场对于既掌握大数据理论知识又具备实战能力的大数据技术人才的需求急剧增加。为了应对这一挑战,唯众精心设计了一套全面的大数据…

国产 麒麟 ARM 环境编译 RocketMQ-Client-CPP

1.环境 系统版本:Linux 5.4.18-87.76-generic KYLINOS SMP Thu Aug 31 09:05:44 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux GCC: gcc (Ubuntu 9.3.0-10kylin2) 9.3.0 G: g (Ubuntu 9.3.0-10kylin2) 9.3.0 RocketMQ服务端版本:5.1.1 RocketMQ-cpp …

修改docker的/var/lib/docker/overlay2储存路径

目录 目录 1.准备新的存储位置 1.创建新的存储目录 2.修改目录权限 2. 配置 Docker 使用新的存储位置 1.停止 Docker 服务 2.编辑 Docker 配置文件 3.迁移现有 Docker 数据 1.将现有的 Docker 数据从系统盘移动到新目录 2.启动 Docker 服务 3. 验证更改 4. 清理旧的…

RAGFlow v0.9 重磅升级,支持 GraphRAG,开启下一代 RAG 之旅!

一、引言 前面我们介绍过很多的关于大模型和RAG相关的技术,通过其关注程度足以看到市场上对RAG框架和成熟产品的迫切需求,因为想要个人独立从0开始实现一个RAG产品并非易事,虽然有相当多的RAG或者知识库开源产品,大部分其实很难应…

使用 Elasticsearch RestHighLevelClient 进行查询

Elasticsearch 提供了多种客户端库,以方便不同编程语言的用户进行操作。其中,Java 的 RestHighLevelClient 是 Elasticsearch 官方推荐的客户端之一,用于 Java 应用程序中。本文将介绍如何使用 Java 的 RestHighLevelClient 进行 Elasticsear…

Docker Hub 镜像代理加速

因为未知原因,docker hub 已经不能正常拉取镜像,可以使用以下代理服务来进行: "https://docker.m.daocloud.io", "https://noohub.ru", "https://huecker.io", "https://dockerhub.timeweb.cloud"…

深入浅出消息队列----【顺序消息的实现原理】

深入浅出消息队列----【顺序消息的实现原理】 何为顺序发消息的顺序性存储消息的顺序性消费消息的顺序性顺序消息消费的三把锁第一把锁:分布式锁第二把锁:Synchronized第三把锁:ReentrantLock 本文仅是文章笔记,整理了原文章中重要…