搜索
首页Javajava教程一文详解怎么实现微服务鉴权
一文详解怎么实现微服务鉴权Jan 27, 2023 am 08:30 AM
微服务鉴权

本篇文章给大家带来了关于鉴权的相关知识,其中主要介绍了微服务中鉴权的实现思路是什么?又有什么好的方案来实现呢?下面一起来看一下,希望对大家有帮助。

最近刚好有小伙伴在微信上问到这个问题,我就来和大家聊一聊,本文主要和小伙伴们聊一聊思路,不写代码,小伙伴们可以结合我之前的文章,应该能够自己写出来本文的代码。当然,思路也只是我自己的一点实践经验,不一定是最完美的方案,欢迎小伙伴们在留言中一起探讨。

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 请求设置请求头信息。

好啦,关于微服务中的鉴权,我们目前是这么做的,欢迎小伙伴们留言一起探讨。

推荐学习:《小程序视频教程》《Java视频教程

以上是一文详解怎么实现微服务鉴权的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:juejin。如有侵权,请联系admin@php.cn删除
应用实例:使用go-micro 构建微服务推荐系统应用实例:使用go-micro 构建微服务推荐系统Jun 18, 2023 pm 12:43 PM

随着互联网应用的普及,微服务架构已成为目前比较流行的一种架构方式。其中,微服务架构的关键就是将应用拆分为不同的服务,通过RPC方式进行通信,实现松散耦合的服务架构。在本文中,我们将结合实际案例,介绍如何使用go-micro构建一款微服务推荐系统。一、什么是微服务推荐系统微服务推荐系统是一种基于微服务架构的推荐系统,它将推荐系统中的不同模块(如特征工程、分类

使用go-zero实现微服务的动态路由使用go-zero实现微服务的动态路由Jun 22, 2023 am 10:33 AM

随着云计算和容器化技术的普及,微服务架构已成为现代化软件开发中的主流方案。而动态路由技术则是微服务架构中必不可少的一环。本文将介绍如何使用go-zero框架实现微服务的动态路由。一、什么是动态路由在微服务架构中,服务的数量和种类可能非常多,如何管理和发现这些服务是一项非常棘手的任务。传统的静态路由并不适用于微服务架构,因为服务数量以及运行时的状态都是动态变化

go-zero与Docker的完美结合:高效构建容器化的微服务架构go-zero与Docker的完美结合:高效构建容器化的微服务架构Jun 22, 2023 am 09:08 AM

随着互联网的快速发展,微服务架构渐渐成为了业界的热门话题,而Docker作为容器化的利器,更是被广泛应用于微服务架构中的部署和运维。而今天我要介绍的是另一款非常优秀的微服务框架——go-zero,以及它与Docker的完美结合。一、什么是go-zerogo-zero是一款由饿了么点评公司开源的,基于Go语言构建的微服务框架。它的特点是高性能、易于使用和功能全

自动扩展的go-zero微服务架构自动扩展的go-zero微服务架构Jun 22, 2023 am 11:14 AM

近年来,随着云计算和微服务架构的普及,越来越多的企业和开发者开始使用微服务架构来搭建自己的应用。然而,微服务架构也存在着一些问题,比如服务的扩展、管理、监控等方面。为了解决这些问题,很多开发者开始使用go-zero微服务框架。go-zero是一款基于Go语言开发的微服务框架,它提供了一系列的组件和工具,帮助开发者快速构建、管理和扩展自己的微服务。其中最重要的

有哪些适合于Go语言开发的微服务框架?有哪些适合于Go语言开发的微服务框架?Jun 03, 2023 am 08:41 AM

随着微服务架构的兴起,越来越多的开发者开始探索如何将应用程序拆分成小而独立的服务,并将它们组合成一个更大的应用。Go语言因其高效、简洁和并发性能出色的特点,成为了其中一个热门的用于微服务开发的语言。而本文将介绍一些适合于Go语言开发的微服务框架。GinGin是一款快速、灵活和轻量级的Web框架,具有丰富的功能和优雅的API。它通过HTTP路由机制和中间件来帮

Python 对微服务架构有效吗?Python 对微服务架构有效吗?May 18, 2023 pm 09:28 PM

在选择适合微服务架构的编程语言时,Python是其中一种选择。它具有活跃的社区、更好的原型设计以及在开发人员中受欢迎等好处。它有一些限制,因此可以使用其他语言来避免它们。快速开发架构风格回顾与统计两种主要的开发架构风格是单体架构和微服务架构。Monolithic具有一体化的原则,并作为一个整体结构发挥作用,最适合小型开发项目或初创企业。当一个平台增长并且业务需要复杂的应用程序时,将其拆分为微服务架构是合理的。一些语言和框架更适合构建微服务架构。Java、Javascript和Python被列为微

PHP中的KubernetesPHP中的KubernetesMay 26, 2023 pm 10:10 PM

Kubernetes是近年来非常火热的容器编排和管理工具,PHP作为一种非常流行的Web开发语言,也需要适应这个趋势,通过Kubernetes来管理自己的应用。在本文中,我们将探讨如何在PHP应用中使用Kubernetes。一、Kubernetes概述Kubernetes是由Google公司开发的一个容器编排和管理工具,用于管理容器化应用。Kubernete

如何使用Go构建微服务架构的应用如何使用Go构建微服务架构的应用Jun 17, 2023 am 09:39 AM

随着软件开发的不断发展,微服务架构已经逐渐成为了一种非常流行的架构模式。而在微服务架构中,Go语言作为一种高性能的编程语言也逐渐受到了越来越多的关注。那么,如何使用Go构建微服务架构的应用呢?下面将通过几个步骤来详细介绍。1.选择合适的Go框架选择合适的Go框架非常重要,它能够让我们更快地构建出一些基础服务,比如HTTP服务、日志服务、数据库服务等等。当前,

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境