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

本文是 《精读 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,一经查实,立即删除!

相关文章

pat 团体天梯赛 L2-012. 关于堆的判断

L2-012. 关于堆的判断 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者陈越将一系列给定数字顺序插入一个初始为空的小顶堆H[]。随后判断一系列相关命题是否为真。命题分下列几种: “x is the root”:x是根结点;“x a…

04-1.jQuery事件与补充each/data

目录 事件 事件绑定 常用事件 阻止后续事件执行 补充 each .data() 事件 事件绑定 .on( events [, selector ],function(){}) events: 事件selector: 选择器(可选的)function: 事件处理函数 普通绑定,没有选择器&#x…

【刷出存在感】锋会圆桌现场

【编者按】本文为锋会|路由器专场的圆桌全文(有删减)。 圆桌嘉宾:(自左向右依次) 极路由联合创始人 丁衣 知道创宇研究部总监(安全专家) 余弦 WRTnode创始人(开源硬件领域&#xff0…

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

() 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;金融行业信息化设备的软硬件系统被外商垄断。这等…

mysql查询优化以及面试小结

mysql面试小结&#xff1a; 1.mysql的基本架构 2.mysql的索引 btree的原理 3.mysql的索引优化 4.mysql的sql查询优化 慢查询日志 Show prodile 全局查询日志 5.mysql的主从复制 6.mysql的锁机制 表锁 行锁转载于:https://www.cnblogs.com/daiwei1981/p/10224934.html

05.Bootstrap导入基础笔记

Bootstrap介绍 Bootstrap是Twitter开源的基于HTML、CSS、JavaScript的前端框架。 它是为实现快速开发Web应用程序而设计的一套前端工具包。 它支持响应式布局&#xff0c;并且在V3版本之后坚持移动设备优先。 为什么要使用Bootstrap&#xff1f; 在Bootstrap出现之前&…

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的…

rest-framework-权限组件

rest-framework-权限组件 一 权限简介 只用超级用户才能访问指定的数据&#xff0c;普通用户不能访问&#xff0c;所以就要有权限组件对其限制 二 局部使用 from rest_framework.permissions import BasePermission class UserPermission(BasePermission):message 不是超级用户…

linux服务器上如何显示工作路径

1. 修改PS环境变量 [rootlinux-node01 ~]# vi /etc/bashrc [ "$PS1" "\\s-\\v\\\$ " ] && PS1"[\u\h \W]\\$ "将PS1"[\u\h \W]\\$ "修改成PS1"[\u\h \w]\\$ " 2. 重新打开一个窗口 [rootlinux-node01 ~]# cd /etc…

MySQL-01:下载安装配置及初始化命令

目录 1、下载 2、解压 3、初始化 4、启动MySQL服务 5、连接MySQL服务 6、快捷设置 a. 添加环境变量 b. 将MySQL服务制作成windows服务 1、下载 下载压缩包&#xff0c;非安装包 下载网址&#xff1a; http://dev.mysql.com/downloads/mysql/ 2、解压 选择解压目录&…

根据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;再等…

MySQL-02:“数据库”操作基本命令及权限笔记

目录 数据库操作 1、显示数据库 2、创建数据库 3、使用数据库 4、用户管理 5、授权管理 数据库操作 1、显示数据库 SHOW DATABASES; 默认数据库&#xff1a;   mysql - 用户权限相关数据   test - 用于用户测试数据   information_schema - MySQL本身架构相关数据…

C++STL——概述

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