`

微服务授权

 
阅读更多

背景

从传统的单体应用转型Spring Cloud的朋友都在问我,Spring Cloud下的微服务权限怎么管?怎么设计比较合理?从大层面讲叫服务权限,往小处拆分,分别为三块:用户认证用户权限服务校验

用户认证

传统的单体应用可能习惯了session的存在,而到了Spring cloud的微服务化后,session虽然可以采取分布式会话来解决,但终究不是上上策。开始有人推行Spring Cloud Security结合很好的OAuth2,后面为了优化OAuth 2中Access Token的存储问题,提高后端服务的可用性和扩展性,有了更好Token验证方式JWT(JSON Web Token)。这里要强调一点的是,OAuth2JWT这两个根本没有可比性,是两个完全不同的东西。 
OAuth2是一种授权框架,而JWT是一种认证协议

OAuth2认证框架

OAuth2中包含四个角色:
  • 资源拥有者(Resource Owner)
  • 资源服务器(Resource Server)
  • 授权服务器(Authorization Server)
  • 客户端(Client)
OAuth2包含4种授权模式
  • 授权码(认证码)模式 (Authorization code)
  • 简化(隐形)模式 (Impilict
  • 用户名密码模式 (Resource Owner Password Credential)
  • 客户端模式 (Client Credential)

其中,OAuth2的运行流程如下图,摘自RFC 6749:

 

+--------+                               +---------------+
|        |--(A)- Authorization Request ->|   Resource    |
|        |                               |     Owner     |
|        |<-(B)-- Authorization Grant ---|               |
|        |                               +---------------+
|        |
|        |                               +---------------+
|        |--(C)-- Authorization Grant -->| Authorization |
| Client |                               |     Server    |
|        |<-(D)----- Access Token -------|               |
|        |                               +---------------+
|        |
|        |                               +---------------+
|        |--(E)----- Access Token ------>|    Resource   |
|        |                               |     Server    |
|        |<-(F)--- Protected Resource ---|               |
+--------+                               +---------------+

 

我们在Spring Cloud OAuth2中,所有访问微服务资源的请求都在Http Header中携带Token,被访问的服务接下来再去请求授权服务器验证Token的有效性,目前这种方式,我们需要两次或者更多次的请求,所有的Token有效性校验都落在的授权服务器上,对于我们系统的水平扩展成为一个非常大的瓶颈。

JWT认证协议

授权服务器将用户信息和授权范围序列化后放入一个JSON字符串,然后使用Base64进行编码,最终在授权服务器用私钥对这个字符串进行签名,得到一个JSON Web Token

假设其他所有的资源服务器都将持有一个RSA公钥,当资源服务器接收到这个在Http Header中存有Token的请求,资源服务器就可以拿到这个Token,并验证它是否使用正确的私钥签名(是否经过授权服务器签名,也就是验签)。验签通过,反序列化后就拿到Toekn中包含的有效验证信息。

其中,主体运作流程图如下:

+-----------+                                     +-------------+
|           |       1-Request Authorization       |             |
|           |------------------------------------>|             |
|           |     grant_type&username&password    |             |--+
|           |                                     |Authorization|  | 2-Gen
|           |                                     |Service      |  |   JWT
|           |       3-Response Authorization      |             |<-+
|           |<------------------------------------| Private Key |
|           |    access_token / refresh_token     |             |
|           |    token_type / expire_in           |             |
|  Client   |                                     +-------------+
|           |                                 
|           |                                     +-------------+
|           |       4-Request Resource            |             |
|           |-----------------------------------> |             |
|           | Authorization: bearer Access Token  |             |--+
|           |                                     | Resource    |  | 5-Verify
|           |                                     | Service     |  |  Token
|           |       6-Response Resource           |             |<-+
|           |<----------------------------------- | Public Key  |
+-----------+                                     +-------------+

通过上述的方式,我们可以很好地完成服务化后的用户认证。

用户权限

传统的单体应用的权限拦截,大家都喜欢shiro,而且用的颇为顺手。可是一旦拆分后,这权限开始分散在各个API了,shiro还好使吗?笔者在项目中,并没有用shiro。前后端分离后,交互都是token,后端的服务无状态化,前端按钮资源化,权限放哪儿管好使?

抽象与设计

在介绍灵活的核心设计前,先给大家普及一个入门的概念:RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。

RBAC其实是一种分析模型,主要分为:基本模型RBAC0(Core RBAC)、角色分层模型RBAC1(Hierarchal RBAC)、角色限制模型RBAC2(Constraint RBAC)和统一模型RBAC3(Combines RBAC)。

更多详情大家可以了解:RBAC权限模型

 

核心UML



 这是笔者通过多种业务场景后抽象的RBAC关系图

类说明
  • Group

群或组,拥有一定数量权限的集合,亦可以是权限的载体。

子类:User(用户)、Role(角色)、Position(岗位)、Unit(部门),通过用户的特定构成,形成不同业务场景的群或组,而通过对群或组的父类授权,完成了用户的权限获取。

  • Permission

权限,拥有一定数量资源的集成,亦可以是资源的载体。

  • Resources

权限下有资源,资源的来源有:Menu(菜单)、Button(动作权限)、页面元素(按钮、tab等)、数据权限等

  • Program

程序,相关权限控制的呈现载体,可以在多个菜单中挂载。

  • 常见web程序基本构成


  •  
    模型与微服务的关系

    如果把Spring Cloud服务化后的所有api接口都定义为上文的Resources,那么我们可以看到这么一个情况。

    比如一个用户的增删改查,我们的页面会这么做 



 

页面元素 资源编码 资源URI 资源请求方式
查询 user_btn_get /api/user/{id} GET
增加 user_btn_add /api/user POST
编辑 user_btn_edit /api/user/{id} PUT
删除 user_btn_del /api/user/{id} DELETE

在抽象成上述的映射关系后,我们的前后端的资源有了参照,我们对于用户组的权限授权就容易了。比如我授予一个用户增加、删除权限。在前端我们只需要检验该资源编码的有无就可以控制按钮的显示和隐藏,而在后端我们只需要统一拦截判断该用户是否具有URI和对应请求方式即可。

至于权限的统一拦截是放置在Zuul这个网关上,还是落在具体的后端服务的拦截器上(Filter、Inteceptor),都可以轻而易举地实现。不在局限于代码的侵入性。放置Zuul流程图如下: 



 要是权限的统一拦截放置在Zuul上,会有一个问题,那就是后端服务安不安全,服务只需要通过注册中心,即可对其他服务进行调用。这里就涉及到后面的第三个模块,服务之间的鉴权。

服务之间的鉴权

因为我们都知道服务之间开源通过注册中心寻到客户端后,直接远程过程调用的。对于生产上的各个服务,一个个敏感性的接口,我们更是需要加以保护。主题的流程如下图: 

 



 笔者的实现方式是基于Spring Cloud的FeignClient Inteceprot(自动申请服务token、传递当前上下文)和Mvc Inteceptor(服务token校验、更新当前上下文)来实现,从而对服务的安全性做进一步保护。

结合Spring Cloud的特性后,整体流程图如下: 



 

优化点

虽然通过上述的用户合法性检验、用户权限拦截以及服务之间的鉴权,保证了Api接口的安全性,但是其间的Http访问频率是比较高的,请求数量上来的时候,的问题是就会特别明显。可以考虑一定的优化策略,比如用户权限缓存、服务授权信息的派发与混存、定时刷新服务鉴权Token等。

 

 

  • 大小: 60.9 KB
  • 大小: 25.5 KB
  • 大小: 234.5 KB
  • 大小: 60.3 KB
  • 大小: 91.7 KB
  • 大小: 212.8 KB
分享到:
评论

相关推荐

    第一节 微服务架构演变以及微服务授权中心搭建1

    【微服务架构演变及微服务授权中心搭建】 微服务架构是一种现代软件开发和部署的方式,它将单一的应用程序拆分成一组小型、独立的服务,每个服务都专注于完成特定的业务功能。这种架构模式起源于对传统单体架构的...

    microservice:微服务授权服务器-资源服务器-网关

    微服务微服务授权服务器-资源服务器-网关Oauth2服务器使用非对称身份验证服务器导入数据库生成密钥对------------分支主管----------------- 使用过的Jwt令牌存储。 令牌生成的存储在内存中。 ------------分支oauth...

    opa-traefik-microservice-authz:在 API Gateway (Traefik) 中使用 Open Policy Agent 进行微服务授权的场景的概念实现证明

    使用开放策略代理和 API 网关的微服务授权 这是在 API Gateway (Traefik) 中使用 Open Policy Agent 进行微服务授权的概念实现证明。 我们的博客中提供了我们的用例和实现的详细描述 - 为什么 微服务环境中的身份...

    opa-ms-example:该存储库包含为示例应用程序创建的代码,该示例应用程序创建用于解释使用OPA进行微服务授权

    opa-ms-sample 该存储库包含为示例应用程序创建的代码,该示例应用程序创建用于解释使用OPA进行微服务授权。在Minikube上部署可以使用docker hub上的预编译映像和deployment\cpq.yaml文件将示例部署在minikube上。 ...

    一种基于OAuth2.0的微服务电力系统授权方案.pdf

    "一种基于OAuth2.0的微服务电力系统授权方案.pdf" 本文主要介绍了一种基于OAuth2.0的微服务电力系统授权方案,以解决传统电力系统信息孤岛问题。该方案引入双重校验机制,同时对客户端和用户进行授权鉴权,满足电力...

    微服务微服务微服务微服务.zip

    - **安全与授权**:跨服务的身份验证和授权需要精心设计,例如使用OAuth2和JWT。 4. **相关技术**: - **容器化**:Docker和Kubernetes提供了一种标准化的方式来打包和运行微服务,简化了部署和管理。 - **API ...

    微服务精选:用户中心微服务设计理念.pdf

    在这其中,用户中心微服务设计理念扮演着至关重要的角色,它不仅管理着用户的认证和授权过程,还直接关系到用户体验的优劣和企业的业务安全性。本文档将深入探讨用户中心微服务设计理念的精髓,追溯其发展史,剖析...

    【Java面试+Java学习指南】一部分大部分Java招聘所需要掌握的核心知识 .zip

    点击关注微信公众号及时获取笔主最新更新文章,并可免费领取Java工程师必备学习资源目錄Java全学习路线Java基础基础知识容器JavaWeb春天SpringMVCSpringBootSpringCloud微服务授权鉴权Java进阶最终JVM資料MySQL项目...

    网络与分布计算实验1

    通过这个实验,你不仅可以掌握网络与分布计算的基本概念,还能实际操作JWT、SSO、Flutter和微服务授权,同时对Apache Ignite的使用也会有更深刻的理解。这将对你的IT职业生涯,特别是在分布式系统和移动开发领域,...

    微服务技术架构设计图.pptx

    微服务技术架构设计是现代软件开发领域中的一个重要话题,它旨在通过将大型的单体应用分解为一组小型、独立的服务,以提高系统的可扩展性、可维护性和敏捷性。在"微服务技术架构设计图.pptx"中,我们可以看到多种...

    SpringCloud+SpringBoot+OAuth2+Spring Security+Redis实现的微服务统一认证授权

    在构建分布式系统时,微服务架构的采用使得系统的复杂性增加,其中认证授权成为关键的一环。本项目基于Spring Cloud、Spring Boot、OAuth2、Spring Security以及Redis技术栈,实现了一个高效、安全的微服务统一认证...

    后台权限管理系统微服务

    idea开发的springboot项目后端微服务,使用gradle搭建,...权限管理通过shiro认证授权,可以通过nginx配置集成其他微服务,只需要调用应用中的授权接口即可。 api接口说明采用swagger,详情可以参考项目中的Readme文件

    微服务网关入门.zip

    服务网关是微服务架构中的一个关键的角色,用来保护、增强和控制对于微服务的访问,服务网关是一个处于应用程序或服务之前的系统,用来管理授权、访问控制和流量限制等,这样微服务就会被服务网关保护起来,对所有的...

    Istio微服务治理方案.docx

    Istio 微服务治理方案是基于 Service Mesh 架构的微服务治理解决方案,旨在提供一种统一的微服务治理标准,以解决微服务架构中的痛点问题。 一、微服务的“痛点” 微服务架构的流行使得微服务化变得越来越普遍,...

    从0开始学微服务

    5. **API Gateway**:API Gateway是微服务架构中的一个重要组件,它作为所有客户端和后端服务之间的入口点,处理路由、认证、授权、限流等功能,减少了服务间的直接交互,提高了系统的可维护性。 6. **服务注册与...

    微服务+spring授权服务器(OAuth2.1)+eureka+spring网关.zip

    【标题】: 微服务架构下的Spring授权服务器...通过学习和实践这个资料包,开发者可以深入了解微服务架构下安全、高效的服务间通信,并能构建自己的OAuth2.1授权服务器、Eureka服务发现系统以及Spring Gateway API网关。

    微服务架构与实践pdf

    6. **API Gateway**:作为系统对外的统一入口,处理跨服务的认证、授权、路由,以及可能的聚合和缓存等操作。 7. **持续集成/持续交付(CI/CD)**:微服务架构鼓励快速迭代和频繁部署,CI/CD流程是实现这一目标的...

    微服务权限控制demo

    4. **服务间授权**:每个微服务内部也需要实现权限控制,确保只有具备相应权限的请求才能执行。Spring Security的授权机制可以实现这一点,通过定义访问决策管理器和访问决策投票器来决定是否允许访问。 5. **安全...

    微服务结合Oauth2资料.zip

    微服务架构是一种将大型应用程序分解为一组小型、独立的服务的方式,每个服务都专注于特定业务功能,可以...通过研究和实践这些代码,可以深入理解微服务架构中安全授权的关键点,以及如何在实际项目中应用这些技术。

Global site tag (gtag.js) - Google Analytics