微服务和分布式系统中的授权解决方案

本文是 《精读 Mastering ABP Framework》 2.3 探索横切关注点 - 使用授权和权限系统 一节的扩充内容,重点探讨了授权在分布式和微服务系统中遇到的挑战,以及 ABP Framework 中采用的解决方案。

认证 & 授权

  • • 认证(Authentication):确认用户身份

  • • 授权(Authorization):授予用户访问资源的权限

关于认证和授权的基础内容,可回顾:2.3 探索横切关注点 - 使用授权和权限系统 。

在微服务和分布式系统,对于权限,我们需要考虑的更多,比如:如何在一个微服务中设置权限,而在另一个微服务中检测权限,以及权限如何集中管理。

分布式系统中,认证和授权信息通常以 令牌(Token) 方式描述,所以先了解令牌内容的格式以及令牌如何存储。

访问令牌

访问令牌内容如下:

b4f7708a2bc12f4d3201fa725fbd5d4d.png
access_token_content

访问令牌内容由多个声明(Claim)组成,包含标准声明自定义声明

标准声明(claims)

  • • Sub: 用户Id

  • • Role: 用户角色

  • • Scope: 允许的范围

存储访问令牌

对于WEB应用程序,存储在浏览器本地存储(Local Storage),键为 access_tokenid_token 。

44b39041cdd59f2a1238a6027d34aa77.png
token_store

对于其他类型的应用程序,同样可以在获取到访问令牌之后,在本地存储。

授权类型 & 需求

  • • 基于声明的策略

  • • 开/关风格权限(通常是基于用户和角色)

    • • 开关数据保存在权限数据库中

  • • 自定义策略

    • • 检查权限数据库并直接应用自定义逻辑

  • • 基于资源的策略

    • • 检查权限数据库并根据请求的资源应用自定义逻辑

基于资源的策略

基于资源的策略,用一句话来描述就是:用户客户端(C)是否可以在资源(R)上执行操作(A) ?

举个例子:权限控制:当前用户是否可以编辑产品信息?

我们使用基于资源的策略,来实现以上权限控制:操作(A)对应编辑资源(R)对应产品信息用户(C)对应当前用户

关于编辑可能存在的授权逻辑:

  • • 如果产品被锁定,不允许

  • • 如果产品是由当前用户创建的,则允许

  • • 如果用户有编辑产品的权限,则允许,该权限由管理员管理用户

  • • 如果用户所属的角色有编辑权限,则允许

  • • 只有当用户在产品所属的部门中工作时,才允许

基于资源的策略,可以很好地处理以上授权逻辑。

需求:授权组件

设计一个良好的授权系统,我们通常需要考虑的四个点:

  • • 策略实施点

  • • 策略决策点

  • • 策略信息点

  • • 策略管理点

策略实施点(PEP: Policy Enforcement Point),即在哪里实施授权? 在API网关中?还是在当前服务中?

策略决策点(PDP: Policy Decision Point)即在哪里执行授权逻辑?。在当前的过程中?还是在专门的服务中?

策略信息点(PIP: Policy Information Point)即从哪里以及如何获取执行授权逻辑的数据? 直接访问数据库?还是按需收集?

策略管理点(PAP: Policy Administration Point)即直接访问数据库?按需收集? 通常系统中提供统一的管理界面。

架构讨论

基于前面授权组件的四个点,我们需要做一些讨论,以及清楚其实现方式的利弊。

讨论1:外部授权服务

策略实施点(PEP)发生在微服务中,在微服务中调用授权服务(PDP),进行权限控制。

f8730782f793ea88fde3f4b882c295bb.png
external_authorization_service

如何获取应用数据?

  • • 直接从服务数据库中读取?

  • • 在授权服务调用发送数据?

  • • 将数据预复制到授权服务的数据库中?

其他问题:

  • • 授权服务调用上的网络延迟。

  • • 授权服务成为瓶颈。

讨论2:在API网关检查

策略实施点(PEP)发生在网关中,在网关中调用授权服务(PDP),进行权限控制。

6032dbaa1fbfdf262e632fe5479e1559.png
check_api_gateway

优点

  • • 将授权逻辑与微服务解耦

  • • 防止未经授权的请求调用微服务

缺点

  • • 需要在API中自定义处理逻辑,受限于网关实现选择的技术

  • • 需要将权限映射到HTTP,如:URL, HTTP 方法和 HTTP头。

讨论3:授权类库

将策略实施点、策略决策点、策略信息点的操作封装为通用的类库,在微服务中调用管理权限。

d34178517e8a0b4b739a7fbd4dd62b49.png
authorization_library

优点

  • • 将授权逻辑与微服务逻辑解耦

  • • 应用程序数据可用

  • • 可以自定义授权逻辑

缺点

  • • 如果使用不同技术开发的微服务,如:.NET 、Python、Java,则存在问题,不能跨开发语言。

综合以上三种方案的优缺点,采用授权类库的方式

讨论4:如何保存权限数据?

方式一:每个微服务在自己的数据库中都有自己的权限表?

  • • 难以管理(加载和保存)权限

  • • 很难得到所有的权限

  • • 服务的责任太大

方式二:一个中央权限数据库?

  • • 所有服务都通过授权库直接连接到该数据库。

综合以上两种方式,采用中央权限数据库,实现策略信息点。

讨论5:如何检查和管理所有权限?

方式一:询问所有微服务的权限需求?

问题:服务发现、性能、服务上的负载太多,难以管理权限。

方式二:计算微服务中的所有权限并在中心位置预缓存?

管理和刷新缓存非常困难,任意的数据更改可能会影响许多用户的权限,缓存会太大。

方式三:在权限管理服务的中心位置计算权限?

非常适合开/关风格的权限,对微服务内部的依赖最小。

综合以上三种方式,采用在权限管理服务的中心位置计算权限,实现策略管理点(PAP)。

ABP 解决方案

基于以上的架构分析,我们来看一看在 ABP Framework 中的具体实现。

权限管理

定义权限

ac3d6b31117b77ecaf680e8eda7a80bc.png
define_permissions

检测权限

5f3650d64d3f183a68664ad1dce48fe8.png
check_permissions

授予权限

13c26ef6fd0848fe973ae219ab0ef5c3.png
grant_permissions

定义权限

c8d997ac8a5c53d225c0e1924c57ee45.png
apb_permission_define

定义权限相关参数:

  • • 权限名称

  • • 显示本地化权限名称

  • • 其他依赖:功能,全局功能

  • • 自定义数据

微服务中的权限管理

权限管理UI

e0229ff2dd0a2e464984bfc0477f7440.png
permission_manage_ui

管理UI数据来自,权限管理微服务;其他微服务中权限数据(权限定义、权限组、授权信息)保存到权限管理数据库中。

097e354d827ff972bdde6fd7af1adaa9.png
abp_permission_microservice

在权限管理微服务中和其他微服务一样使用 ABP 授权类库。

基于资源的授权

ABP 采用基于资源的授权策略

3a17a956ced42f48811b11220d03b892.png
resource_base_permission

权限过滤

需要获取 资源(实体) 列表,根据业务规则、用户预设和权限进行筛选。

dca183f7ba5ca522a5dfe992eacd88a7.png
aggregateroot_question

上图代码中,根据实体中的信息实施相应的业务规则,设置权限:

  • • OrganizationId 组织Id,允许组织

  • • CategoryId 类别Id,允许类别

  • • AssignedUserId 分配用户Id,允许分配用户可见

  • • CreatorUserId 创建用户Id,允许创建用户可见

  • • IsResolved 是否解决,在UI过滤

更新权限定义

关于服务启动

  • • 计算所有权限定义的哈希值

  • • 与分布式缓存中的哈希值进行比较

  • • 序列化和保存权限定义(仅更改/新增)

  • • 更新权限戳以通知其他服务

  • • 使用微服务名称作为缓存键前缀

2f58fa820e8f99b1c7818b4d2fae4a45.png
update_permission_define

获取权限定义

获取逻辑

  • • 如果是最新的,检查权限缓存戳并使用内存中的缓存。频率控制(30秒)。

  • • 如果不同,获取并反序列化权限定义。

在服务器启动时,预缓存权限定义。

4ae7f25b83ea8780f4da8b24707d4699.png
abp_get_permission_define

用户界面:检测所有权限

获取当前用户所有授予权限的列表!我们为什么需要它?用于控制显示或隐藏菜单项;用于控制显示或隐藏UI中的部分内容,如:按钮,标题,工具栏等;用于检查SPA的客户端权限。

968984ee626e1569ad81470c463791f3.png
check_all_permission

管理:管理所有权限

将管理一个角色或用户的所有权限在同一个地方显示。

787c16eb1df11dfb67bb2aeaa1e6d09d.png
manage_all_permission

结论

微服务和分布式系统中的授权系统设计:

  • • 设计注意事项:策略实施点、策略决策点、策略信息点和策略管理点。

  • • 集中存储权限数据。

  • • 集中管理,采用开关风格权限。

  • • 总是要求微服务自定义和基于资源的权限。

  • • 依赖数据库查询进行基于权限的过滤。

本文已收录到《精读 Mastering ABP Framework》  第六部分:扩展

a54bc6a1ecd0af1b71cea2b058bc53bc.png

精读 Mastering ABP Framework

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

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

相关文章

如何从命令行浏览和连接到无线网络

() We are always on the lookout for geeky ways to impress our friends, and recently we came across a way to connect to our wireless network from the command prompt, so today we’ll show you how to do it as well. 我们一直在寻找令人印象深刻的方式来打动我们的…

html 基础之canvas 和 localStorage

1&#xff0c;建立一个canvas 画布&#xff1a; 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <meta name"viewport" content"widthdevice-width, initial-scale1.0">…

国产数据助力金融行业维护信息安全

金融信息系统作为国家关键信息基础设施&#xff0c;直接关系到国家经济、社会的正常运行。长期以来&#xff0c;我国金融信息化依赖进口设备和系统&#xff0c;金融行业尤其是银行业被IBM、HP、甲骨文等外商捆绑较深&#xff0c;金融行业信息化设备的软硬件系统被外商垄断。这等…

etcd v3 集群——简单配置

2019独角兽企业重金招聘Python工程师标准>>> 一、etcd v3安装&#xff1a; tar -axf etcd-v3.2.0-linux-amd64.tar.gz -C /usr/local/src/chmod ax /usr/local/src/etcd-v3.2.0-linux-amd64/etcd*cp -a /usr/local/src/etcd-v3.2.0-linux-amd64/etcd* /usr/local/bi…

windows变量延迟_Windows 10的2018年10月更新可能推迟到11月(这就是原因)

windows变量延迟Microsoft stopped offering Windows 10’s October 2018 Update on October 6, as it was deleting some people’s files. Now, another ugly data loss bug has reared its head, and it won’t be fixed until November. 微软于10月6日停止提供Windows 10的…

根据MediatR的Contract Messages自动生成Minimal WebApi接口

大家好&#xff0c;我是失业在家&#xff0c;正在找工作的博主Jerry。今天给大家介绍一个能大大减少ASP.Net Minimal WebApi编码量的方法。我们一般会把微服务的VO和DTO封装成消息类&#xff0c;并作为WebApi的Request和Response参数进行网络传递。如果使用MediatR&#xff0c;…

bupt summer training for 16 #8 ——字符串处理

https://vjudge.net/contest/175596#overview A.设第i次出现的位置左右端点分别为Li&#xff0c;Ri 初始化L0 0&#xff0c;则有ans sum{ (L[i] - L[i-1]) * (n 1 - Ri) } 1 #include <cstdio>2 #include <cstring>3 #include <iostream>4 #include <a…

程序员必须知道的HTML常用代码有哪些?

HTML即超文本标记语言&#xff0c;是目前应用最为广泛的语言之一&#xff0c;是组成一个网页的主要语言。在现今这个HTML5华丽丽地占领了整个互联网的时候&#xff0c;如果想要通过网页抓住浏览者的眼球光靠因循守旧是不行的&#xff0c;程序猿们需要掌握一些必须知道的HTML常用…

公用ip地址查询_是什么使您无法更改公用IP地址并在Internet上造成严重破坏?

公用ip地址查询What exactly is preventing you (or anyone else) from changing their IP address and causing all sorts of headaches for ISPs and other Internet users? 到底是什么在阻止您(或其他任何人)更改其IP地址并导致ISP和其他Internet用户感到头疼&#xff1f; …

Vim的新一代补全插件:coc.nvim

coc.nvim可以同时在nvim和vim8.1上使用。 安装 参考官方&#xff1a;Install coc.nvim 推荐使用vim-plug插件管理器&#xff0c;在vimrc中添加&#xff1a; Plug neoclide/coc.nvim, {do: { -> coc#util#install()}} 然后输入命令:PlugInstall 等待插件下载&#xff0c;再等…

C++STL——概述

一、相关介绍 STL 标准模板库在编写代码的过程中有一些程序经常会被用到&#xff0c;而且需求特别稳定&#xff0c;所以C中把这些常用的模板做了统一的规范&#xff0c;慢慢的就形成了STL提供三种类型的组件: 容器、迭代器和算法&#xff0c;它们都支持泛型程序设计标准容器 顺…

固态硬盘可靠性_您可以通过使用较少的总容量来提高硬盘的可靠性吗?

固态硬盘可靠性Your computer has a massive hard drive that you significantly underuse. Would decreasing the size of the primary partition actually increase the lifespan of the drive? 您的计算机具有大量未充分使用的巨大硬盘驱动器。 减小主分区的大小是否会真正…

接收上传的multi-file的文件(四)

构建工程 为例创建一个springmvc工程你需要spring-boot-starter-thymeleaf和 spring-boot-starter-web的起步依赖。为例能够上传文件在服务器&#xff0c;你需要在web.xml中加入标签做相关的配置&#xff0c;但在sringboot 工程中&#xff0c;它已经为你自动做了&#xff0c;所…

数据库读写分离 - MyBatis

2019独角兽企业重金招聘Python工程师标准>>> 由于项目中数据量较大&#xff0c;访问量也较高&#xff0c;故在数据库的设计上&#xff0c;采用读写分离思想&#xff0c;达到性能要求&#xff01; 简单科普一下实现读写分离的思路 配置及加载数据库信息&#xff0c;即…

t-mobile频段_T-Mobile再次被黑客入侵:超过200万个帐号和地址可能泄漏

t-mobile频段Attackers may have compromised three percent of T-Mobile’s 77 million customers on Monday, revealing personal information like addresses, phone numbers, and account numbers. 周一&#xff0c;攻击者可能泄露了T-Mobile 7700万客户中的3&#xff05;&…

第二篇 第三章防火防烟分区检查(一)

仓库面积可以增加3倍 就是乘以4 要一定条件 : 第二篇 第三章防火防烟分区检查&#xff08;一&#xff09; 21分钟处 该题比较有代表性 停车库 耐火等级允许最大面积 民用建筑防火分区 防烟分区的划分    防火卷帘控制器的测试 防火阀 装在通风,空调系统中 只有连在风机主管…

如何在Xbox One或PlayStation 4上为Skyrim特别版安装Mods

The Elder Scrolls V: Skyrim Special Edition is now available on PlayStation 4 and Xbox One, and for the first time, “mods” are available to console gamers. Elder Scrolls V&#xff1a;Skyrim特别版现已在PlayStation 4和Xbox One上可用&#xff0c;并且首次向主…

微软宣布:PowerBI 已经与 Office 整合,一切更简单,变革又来了

很多人认为 Office 是 Office&#xff0c;PowerBI 是 PowerBI&#xff0c;怎么在 PPT 中显示 PowerBI 呢&#xff1f;这种问题以后将再不会存在。微软已经宣布&#xff0c;PowerBI 已经与 Office 深度整合&#xff0c;在未来的企业中&#xff0c;PowerBI 将与 Word&#xff0c;…

066:ORM查询条件详解-startswith和endswith:

ORM查询条件详解-startswith和endswith&#xff1a; startswith&#xff1a;判断某个字段的值是否是以某个值开始的。大小写敏感。示例代码如下&#xff1a; articles1 Article.objects.filter(title__startswith"fuck") 以上代码的意思是提取所有标题以 fuck 字符串…

前端工程师面试题汇总

HTML Doctype作用&#xff1f;严格模式与混杂模式如何区分&#xff1f;它们有何意义? HTML5 为什么只需要写 <!DOCTYPE HTML>&#xff1f; 行内元素有哪些&#xff1f;块级元素有哪些&#xff1f; 空(void)元素有那些&#xff1f; 页面导入样式时&#xff0c;使用lin…