返回顶部
首页 > 资讯 > 精选 >如何实现微服务鉴权
  • 427
分享到

如何实现微服务鉴权

2023-07-05 00:07:28 427人浏览 八月长安
摘要

今天小编给大家分享一下如何实现微服务鉴权的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 认证与授权首先小伙伴们知道,无论

今天小编给大家分享一下如何实现微服务鉴权的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1. 认证与授权

首先小伙伴们知道,无论我们学习 shiro 还是 spring Security,里边的功能无论有哪些,核心都是两个:

  • 认证

  • 授权

所以,我们在微服务中处理鉴权问题,也可以从这两个方面来考虑。

1.1 认证

认证,说白了就是登录。传统的 WEB 登录是 Cookie+Session 的方案,这种方案依赖于服务器本地内存,在微服务中,由于服务众多,这种方案显然不再合适。

可能会有小伙伴说用 Redis+SpringSession 做 Session 共享,这是个办法,但是不是最佳方案,因为这种方案的性能以及可扩展性都比较差。

所以,微服务中的认证,还是建议使用令牌的方式,可以选择 Jwt 令牌,这也是目前使用较多的一种方案。但是熟悉 JWT 的小伙伴都知道,纯粹的无状态登录无法实现注销,这就很头大,所以在实际应用中,单纯的使用 JWT 是不行的,一般还是要结合 Redis 一起,将生成的 JWT 字符串在 Redis 上也保存一份,并设置过期时间,判断用户是否登录时,需要先去 Redis 上查看 JWT 字符串是否存在,存在的话再对 JWT 字符串做解析操作,如果能成功解析,就没问题,如果不能成功解析,就说明令牌不合法。

这样有状态登录+无状态登录混在一起的方式,虽然看起来有点不伦不类,但是就当下来说,这个折衷的办法算是一个可行的方案了。

其实,上面的方案,说白了,跟传统的 Cookie+Session 没什么两样,思路几乎都是完全 copy 的:传统的 Session 用 Redis 代替了;传统穿梭于服务端和浏览器之间的 jsessionId 被 JWT 字符串代替了;传统的 jsessionId 通过 Cookie 来传输,现在的 JWT 则通过开发者手动设置后通过请求头来传输;传统的 Session 可以自动续签,现在用 JWT 就是手动续签,每次请求到达服务端的时候,就去看下 Redis 上令牌的过期时间,快过期了,就重新设置一下,其他都一模一样。

这是认证方案的选择。

1.2 授权

微服务中授权,也可以使用 Shiro 或者 Spring Security 框架来做,省事一些。考虑到微服务技术栈都是 Spring 家族的产品,所以在权限框架这块也是建议大家首选 Spring Security(如果有小伙伴对 Spring Security 还不熟悉的话,可以在微信公众号后台回复 ss,有教程)。

当然,如果觉得 Spring Security 比较复杂想自己搞的话,也是可以的。自己搞的话,也是可以借助于 Spring Security 的思路的,松哥最近的一个项目就是这样:

请求到达微服务之后,先找到当前用户的各种信息,包括当前用户所拥有的角色和权限等信息,然后存入到和当前线程绑定的 ThreadLocal 对象中。另一方面自定义权限注解和角色注解,在切面中对这些注解进行解析,检查当前用户是否具备所需要的角色/权限等。

当然,如果你使用了 Spring Security 的话,上面这个就不需要自定义注解了,直接使用 Spring Security 中自带的即可,还可以体验 Spring Security 中更多的丰富的安全功能。

2. 认证服务

那么认证和授权在哪里做?

先来说认证,认证我们可以简单分为两个步骤:

  • 登录

  • 校验

2.1 登录

一般来说,登录我们可以单独做一个认证服务。当登录请求到达网关之后,我们将之转发到认证服务上,完成认证操作。

在认证服务上,我们就去检查用户名/密码是否 OK,用户状态是否都 OK,都没问题的话,生成 JWT 字符串,同时再把数据存入到 Redis 上,然后把 JWT 字符串返回。

如果系统有注册功能的话,注册功能也是放在这个微服务上来完成。

2.2 校验

校验是指每一个请求到达的时候,校验用户是否已经登录。

这个当然可以和 2.1 放到一起去做,但是松哥不建议。问题在于,假如是一个创建订单的请求,这个请求原本是要经过网关转发到订单服务上的,但是,此时就得先在网关上调用 2.1 小节的服务进行登录校验,没问题再转发到订单服务上,这样做很明显很费事,也不合理。

一个比较好的办法是直接在网关上去校验请求的令牌是否合法,这个校验本身也比较容易,校验令牌是否合法,我们只需要看 Redis 上是否存在这个令牌,并且这个 JWT 令牌能够被顺利解析就行,这个操作完全可以在网关上做。

以 Gateway 网关为例,我们可以自定义全局过滤器,在全局过滤器中校验每一个请求的令牌,校验通过了,再进行请求的转发,否则就不转发。

校验通过之后,在转发到具体的微服务之后,我们可以将解析出来的用户 id 以及用户名等信息放到请求头中,然后再转发,这样到达各个具体的微服务之后,就知道这个请求是谁发来的,这人都有哪些角色/权限,方便做下一步的权限校验。

松哥的做法是定义了一个公共模块,所有的微服务都依赖这个公共模块,这个公共模块中定义了一个拦截器,会拦截下来每一个请求,从请求头中取出用户 ID,然后从 Redis 中拿到具体的用户信息,存入到 ThreadLocal 中,这样在后续的方法调用中,如果需要判断用户是否具备某一个权限,就可以通过 ThreadLocal 去获取了。

大致上就是这样一个流程。

3. 授权服务

授权没法放到网关上做,还是得在各个微服务上去完成。

微服务上的授权我们又可以将之大致上分为两类:

  • 前端发送来的请求(外部请求)。

  • 别的微服务发送来的请求(内部请求)。

3.1 外部请求

对于外部请求来说,就按正常的权限校验对待就行了,自定义注解亦或者使用 Spring Security 等框架都是可以的,如果是自定义注解的话,就结合 aop 一起,定义切面自己去处理权限注解,当然,这些功能基本上每一个微服务都是需要的,所以可以将之抽取成为一个公共的模块,在不同的微服务中依赖即可。

3.2 内部请求

对于内部的请求来说,正常是不需要鉴权的,内部请求可以直接处理。问题是如果使用了 OpenFeign,数据都是通过接口暴露出去的,不鉴权的话,又会担心从外部来的请求调用这个接口,对于这个问题,我们也可以自定义注解+AOP,然后在内部请求调用的时候,额外加一个头字段加以区分。

当然,内部请求到达微服务的时候,也是需要进行认证的,就行请求从网关转发到每一个具体的微服务上时需要认证一样,不过很明显,我们没必要每次使用 OpenFeign 调用别的服务的时候,都去传一堆认证信息,我们可以通过实现feign.RequestInterceptor 接口来定义一个 OpenFeign 的请求拦截器,在拦截器中,统一为 OpenFeign 请求设置请求头信息。

以上就是“如何实现微服务鉴权”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: 如何实现微服务鉴权

本文链接: https://lsjlt.com/news/348714.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何实现微服务鉴权
    今天小编给大家分享一下如何实现微服务鉴权的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 认证与授权首先小伙伴们知道,无论...
    99+
    2023-07-05
  • vue-nuxt如何实现登录鉴权
    这篇文章将为大家详细讲解有关vue-nuxt如何实现登录鉴权,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。开始根据这个文档描述,在使用@nuxt/auth 后,如果没有显示指定cookie: false,...
    99+
    2023-06-22
  • Node如何实现JWT鉴权机制
    这篇文章主要介绍“Node如何实现JWT鉴权机制”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node如何实现JWT鉴权机制”文章能帮助大家解决问题。一、为什么使用JWT一种技术的出现,就是弥补另一...
    99+
    2023-07-04
  • .NET CORE如何鉴权
    本篇内容主要讲解“.NET CORE如何鉴权”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“.NET CORE如何鉴权”吧!基础信息1.什么是鉴权授权?鉴权是验证用户是否拥有访...
    99+
    2023-06-29
  • .NET CORE 鉴权的实现示例
    目录基础信息1.什么是鉴权授权?2.传统的Session和Cookie3.存在的问题4.Token.NETCore中鉴权1.NETCore鉴权授权基本概念2.使用Cookie默认流程...
    99+
    2024-04-02
  • vue-nuxt 登录鉴权的实现
    目录介绍链接开始继续往代码中走proxy配置请求拦截处理不同前缀的接口动态路由的配置重定向及auth权限介绍 来自mentor的梳理,做个总结和记录 链接 https://aut...
    99+
    2024-04-02
  • 如何在SpringBoot中使用Spring-AOP实现接口鉴权
    目录面向切面编程AOP的底层原理实现AOP的相关术语相关注解以及切入点表达式实现接口鉴权1. 配置yml文件2. 读取账密配置3.编写接口鉴权方法4. 编写AOP5.编写接口测试面向...
    99+
    2024-04-02
  • SpringCloud如何实现微服务数据权限控制
    这篇文章将为大家详细讲解有关SpringCloud如何实现微服务数据权限控制,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。举个例子:有一批业务员跟进全国的销售订单。他们被按城市进行划分,一个业务员跟进3个...
    99+
    2023-06-21
  • Mongodb中怎么实现认证鉴权
    本篇文章给大家分享的是有关Mongodb中怎么实现认证鉴权,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、Mongodb 的权限管理认识权限...
    99+
    2024-04-02
  • springCloudgateWay统一鉴权的实现代码
    目录一,统一鉴权1.1 鉴权逻辑1.2 代码实现一,统一鉴权 内置的过滤器已经可以完成大部分的功能,但是对于企业开发的一些业务功能处理,还是需要我们自己 编写过滤器来实现的,那么我们...
    99+
    2024-04-02
  • SpringCloud中Gateway实现鉴权的方法
    目录一、JWT 实现微服务鉴权1 什么是微服务鉴权2.代码实现一、JWT 实现微服务鉴权 JWT一般用于实现单点登录。单点登录:如腾讯下的游戏有很多,包括lol,飞车等,在qq游戏对...
    99+
    2024-04-02
  • vue-router后台鉴权流程实现
    目录前言:路由拦截鉴权常用的两种方法比较:与动态路由相关的通常有以下几个文件:router.jspermission.jsstore.js退出登录:结尾:前言: 最近项目遇到一个管理...
    99+
    2022-11-13
    vue-router后台鉴权 vue-router 鉴权
  • SpringBoot整合SpringSecurityOauth2实现鉴权动态权限问题
    目录写在前面准备效果展示实现写在前面 思考:为什么需要鉴权呢? 系统开发好上线后,API接口会暴露在互联网上会存在一定的安全风险,例如:爬虫、恶意访问等。因此,我们需要对非开放API...
    99+
    2024-04-02
  • SpringCloud下实现用户鉴权的方案
    目录一、整体架构二、实现步骤三、其它问题四、完整代码Java下常用的安全框架主要有Spring Security和shiro,都可提供非常强大的功能,但学习成本较高。在微服务下鉴权多...
    99+
    2024-04-02
  • 微服务架构下的服务调用与鉴权——某保险公司微服务平台实施案例分享
    转载本文需注明出处:微信公众号EAWorld,违者必究。引言:根据保险行业发展趋势,目前保险交易已经呈现高频化、碎片化、场景化等特点,对系统的处理能力、容量、业务连续性、需求相应速度、运维响应速度提出了更高的要求。业务模式创新重塑导致系统更...
    99+
    2023-06-05
  • koa2服务端如何使用jwt进行鉴权及路由权限分发
    这篇文章给大家分享的是有关koa2服务端如何使用jwt进行鉴权及路由权限分发的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。大体思路  后端书写REST api时,有一些api是非...
    99+
    2024-04-02
  • 基于PHP怎么实现JWT登录鉴权
    本文小编为大家详细介绍“基于PHP怎么实现JWT登录鉴权”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于PHP怎么实现JWT登录鉴权”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是JWT1、简介JWT...
    99+
    2023-06-30
  • 手把手教你用Java实现一套简单的鉴权服务
    目录前言一、何为鉴权服务二、利用servlet+jdbc实现简单的用户登录程序1.明确思路2.手把手教你实现一个简单的web登录程序三、回顾1.密码未加密裸奔2.登录信息未存储3.对...
    99+
    2024-04-02
  • SpringBoot怎么整合SpringSecurityOauth2实现鉴权动态权限问题
    这篇文章主要介绍“SpringBoot怎么整合SpringSecurityOauth2实现鉴权动态权限问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么整合SpringSec...
    99+
    2023-07-02
  • 基于Python实现云服务器的CDN域名远程鉴权配置
    目录实战场景开启远程鉴权Python 端权限验证验证逻辑实战场景 在项目实战中,会碰到一种特定的运维场景,对CDN访问进行限制,一般手段是开启 referer 防盗链,开启 IP黑白...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作