快速实现细粒度的身份权限管理

授权的含义

在 通用领域内,授权是领导者通过为员工和下属提供更多的自主权,以达到组织目标的过程。

在 计算机领域内,授权是由信息系统指定批准机构授予某实体处理、存储或传送信息的权力。

而在 身份认证领域内,授权是指当客户端经过身份认证后,能够有限的访问服务端资源的一种机制。

为什么要进行「授权」?

在已经构建起的用户系统中,当你的 API 需要判断当前访问用户是否能访问当前资源时,就需要你构建自己的权限系统了。授权是权限系统中一个很重要的概念,是指判断用户具备哪些权限的过程,这与认证完全不同。

对于企业来说,授权能够明确组织成员之间的关系,使职责和边界变得更加清晰,方便公司管理;同时,授权能够保障数据安全、防控风险,不同的权限准许不同的操作,可防止用户人为破坏、数据泄漏、误操作等事故的发生;授权能够提高决策的效率,优秀的授权和权限管理使系统更易操作,使员工的工作效率得到提升。

而从产品角度出发,授权可以保障产品系统的使用安全和数据安全,防止违规操作和数据泄漏;授权也可以提高系统的可操作性,提升用户体验;此外,好的授权功能会提升产品价值,使其在市场上更具有竞争力。

授权模式

授权模式主要为两种,分别是通过基于 OAuth 2.0 流程中的授权码模式,以及通过 API 接口到授权中心对用户授权进行集中验证。

基于 OAuth 2.0 框架的授权模式

OAuth2 框架是一种安全、轻量、标准的授权体系,用于帮助资源方、调用方、资源所有者之间的完成授权流程。如果授权过程中不涉及到资源所有者,可以使用 client_credentials 模式。这种模式一般用于后端服务器的 M2M 模式。你可以在应用详情页获取应用的 ID 和密钥,你需要将其并安全地存储在你的服务器中。

你可以使用 OAuth2.0 的 client_credentials 模拟颁发具备特定 scope 权限的 access_token:

curl --request POST \
  --url https://${YOUR_AUTHING_DOMAIN}/oidc/token \
  --header 'accept: application/json' \
  --header 'cache-control: no-cache' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data 'grant_type=client_credentials&scope=customScope&client_id=CLIENT_ID&client_secret=CLIENT_SECRET'

Authing 会根据调用方请求的资源和上下文环境,动态的决定颁发具备哪些权限的 AccessToken。并返回被拒绝的 scope:

{
  "access_token": "...",
  "token_type": "Bearer",
  "expires_in": 3599,
  "scope": "user",
  "scope_rejected": "xxx yyy"
}

其中 scope 为该 access_token 具备的权限列表,用空格分割。你可以在后端通过 scope 判断用户具备哪些权限。

当授权流程中涉及到需要资源所有者参与授权时,可以使用 OAuth2.0 框架中的授权码模式。你需要将权限项目放在发起授权的链接的 scope 参数中,例如:

https://${YOUR_AUTHING_DOMAIN}/oidc/auth?client_id={你的应用 ID}&scope=openid book:read book:delete&redirect_uri={你的业务回调地址}&state={随机字符串}&response_type=code

需要让资源所有者点击链接,之后会转到登录页面,资源持有者认证自己的身份,并将资源授权授权给调用方。

完成认证授权后,浏览器将跳转到业务回调地址,并通过 URL 传递 code 授权码。调用者可以使用这个 code 授权码到 Authing 换取一个具备权限的 AccessToken,用于获取资源方的资源。

Code 换取 Token 的代码如下:

curl --request POST \
  --url https://${YOUR_AUTHING_DOMAIN}/oidc/token \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data client_id={应用 ID} \
  --data client_secret= {应用密钥} \
  --data grant_type=authorization_code \
  --data redirect_uri={回调地址} \
  --data code={授权码}

同样,Authing 会根据调用方请求的资源和上下文环境,动态的决定颁发具备哪些权限的 AccessToken。并返回被拒绝的 scope:

{
  "access_token": "...",
  "token_type": "Bearer",
  "expires_in": 3599,
  "scope": "openid book:read",
  "scope_rejected": "book:delete"
}

当然,资源方必须在返回资源前,验证调用者是否携带了具备权限的 AccessToken,当一切检验通过,就可以安全地返回资源。

使用权限 API

除了使用 OAuth2.0 的 client_credentials 模式,还可以使用通用的权限 API,通过权限 API 创建角色、给角色授权角色、判断用户是否具备某个权限等。我们支持 Node.js、Python、Java、PHP、C# 等语言的 SDK,详情请见 文档。

权限模型

目前,基于角色的访问控制(RBAC)和基于属性的访问控制(ABAC)是被大家广泛采用的两种权限模型,二者各有优劣。

RBAC 模型构建起来更加简单,缺点在于无法做到对资源细粒度地授权(都是授权某一类资源而不是授权某一个具体的资源);ABAC 模型构建相对比较复杂,学习成本比较高,优点在于细粒度和根据上下文动态执行。

基于角色的访问控制(RBAC)

什么是 RBAC?

基于角色的访问控制(Role-based access control,简称 RBAC),指的是通过用户的角色(Role)赋予其相关权限,这实现了细粒度的访问控制,并提供了一个相比直接授予单个用户权限,更简单、可控的管理方式。

当使用 RBAC 时,通过分析系统用户的实际情况,基于共同的职责和需求,将他们分配给不同的角色。然后可以授予每个用户一个或多个角色,每个角色具有一个或多个权限,这种 用户-角色、 角色-权限 间的关系,让我们可以不用再单独管理单个用户,用户从具备的角色里面继承所需的权限,从而使得用户赋权这件事变得更加简单。

RBAC 的使用场景

以一个简单的场景为例(Gitlab 的权限系统),用户系统中有 Admin、Maintainer、Operator 三种角色,这三种角色分别具备不同的权限,比如只有 Admin 具备创建代码仓库、删除代码仓库的权限,其他的角色都不具备。

我们授予某个用户「Admin」这个角色,他就具备了「创建代码仓库」和「删除代码仓库」这两个权限。

不直接给用户授权策略,是为了之后的扩展性考虑。比如存在多个用户拥有相同的权限,在分配的时候就要分别为这几个用户指定相同的权限,修改时也要为这几个用户的权限进行一一修改。有了角色后,我们只需要为该角色制定好权限后,将相同权限的用户都指定为同一个角色即可,便于权限管理。

基于属性的访问控制(ABAC)

什么是 ABAC?

基于属性的访问控制(Attribute-Based Access Control,简称 ABAC)是一种灵活的授权模型,通过一个或一组属性来控制是否有对操作对象的权限。

其中,ABAC 中的 A,也就是属性(Attribute),用于表示 subject、object 或者环境特征的特点,属性使用 key-value 的形式来存储这些信息,比如我在公司的 role 是 developer,role 是 key,developer 是 value。

ABAC 属性通常来说分为四类:用户属性(如用户年龄),环境属性(如当前时间),操作属性(如读取)和对象属性(如一篇文章,又称资源属性),所以理论上能够实现非常灵活的权限控制。

ABAC 的使用场景

比如,在北京的公司员工明天将用公司内网参加会议培训。其中,「北京」、「公司内网」是环境属性,「参加会议培训」是操作属性。在需要根据这些属性来动态计算权限的时候,RBAC 授权模型将无法满足需求。这个时候就需要使用 ABAC 授权模型。

在 ABAC 权限模型下,你可以轻松地实现以下权限控制逻辑:

  1. 授权某编辑具体某本书的编辑权限;
  2. 当一个文档的所属部门跟用户的部门相同时,用户可以访问这个文档;
  3. 当用户是一个文档的拥有者并且文档的状态是草稿,用户可以编辑这个文档;
  4. 早上九点前禁止 A 部门的人访问 B 系统;
  5. 在除了上海以外的地方禁止以管理员身份访问 A 系统;

上述的逻辑中有几个共同点:

  1. 具体到某一个而不是某一类资源;
  2. 具体到某一个操作;
  3. 能通过请求的上下文(如时间、地理位置、资源 Tag)动态执行策略;

如果浓缩到一句话,你可以 细粒度地授权在何种情况下对某个资源具备某个特定的权限。

RBAC 授权模型是基于角色的访问控制,当面对大型企业与组织时,RBAC 授权模型需要维护大量的角色和授权关系,ABAC 授权模型则会更加灵活。此外,当资源不断增多时,RBAC 授权模型需要维护所有的相关角色,而 ABAC 授权模型只需根据相关属性进行维护,有更强的拓展性。

借助 Authing 实现权限模型

在 Authing 的权限系统中,我们同时支持 RBAC 和 ABAC 的权限模型,即兼顾了管理的效率和授权的粒度。在 Authing 控制台的权限管理模块中可以对资源和角色进行统一管理,并可以采用个性化的授权规则将资源的操作权限授权给角色或者某个用户。

在进行授权的时候首先选择授权用户的主体,除了可以对用户和角色进行授权,还可以对分组和某个组织节点进行授权,这种不同维度的授权模型可以给授权管理带来极大的便利。

我们可以给每一个授权定义授权规则——允许或拒绝某个资源在某些条件下访问。

在控制台定义好授权资源之后,你可以将 Authing 中定义的权限模型通过 API 的形式集成在自己的项目之中,实现对资源权限的控制。

首先初始化 Management SDK:

这里以 Node SDK 为例,我们同时还支持 Python、Java、C#、PHP 等语言的 SDK,详情请见 https://docs.authing.cn/

import { ManagementClient } from 'authing-js-sdk';

const managementClient = new ManagementClient({
    userPoolId: "YOUR_USERPOOL_ID",
    secret: "YOUR_USERPOOL_SECRET"
});

调用 managementClient.acl.isAllowed 方法,三个参数分别为:

  • userId: 用户 ID,用户可以被直接授权特定资源的操作,也可以继承角色被授权的权限。
  • resource: 资源标志符,如 repository:123 表示 ID 为 123 的代码仓库,repository:* 表示代码仓库这一类资源。
  • action: 特定操作,如repository:Delete表示删除代码仓库这个操作。

const { totalCount, list } = await managementClient.acl.isAllowed("USER_ID", "repository:123", "repository:Delete");

Authing 策略引擎会根据你配置的权限策略,动态执行策略,最后返回 true 或者 false,你只需要根据返回值就能判断用户是否具备操作权限。

总结

Authing 不仅通过用户、角色这两种对象实现了 RBAC 模型的角色权限继承,还在此之上实现了如何进行更细粒度、动态的 ABAC 权限模型。这是一个渐进的过程,随着业务的复杂性不断变大,你可以基于 Authing 强大而又灵活的权限系统,快速构建出适合你业务场景的权限模型。

相关推荐

洞察|以 AI Agent 身份为中心的下一代 IDaaS 探索,「零信任」原则是否依然有效

若一个 AI 代理被诱骗点击了恶意链接,也应当因其权限受限而无法进一步获取更多内部信息,从而将影响降到最低。

Authing的博客 1139

Authing 正在寻找云原生应用 / Infra 开发者

我们需要云原生应用开发者和云原生基础设施开发者加入我们

Authing的博客 1121

从数据孤岛到信息共享,应用集成网关打造业务新生态

企业通过应用集成网关轻松打通业务隔阂,让应用相互“对话”,快速实现数字化转型和业务发展的持续增长。

Authing的博客 1141

建立统一网络身份认证平台,赋能用户信息安全

随着网络化、数字化、智能化的演进,在深入推进数字经济创新发展、积极培育新兴产业和未来产业的过程中,安全与发展将是永恒的主题,如何确保网络身份安全将是主旋律。

Authing的博客 1524

Authing 2024 年全员大会:坚持原创性、冒险精神和极客精神,突破瓶颈,引领市场

他的话语不仅回顾了过去一年的挑战,也为员工们描绘了一个充满希望的未来。

Authing的博客 1015

构建用户身份基础设施,推动新能源汽车高质量发展

企业的困惑或许不再是“ 0 到 1 阶段的破冰”该如何落实,而是在技术创新和政策支持不断变化的情况下,如何抓住用户并在消费者心中构筑存在感,才是未来竞争中的关键。

Authing的博客 1669

后量子时代,未来密码该何去何从?

在量子信息时代来临之前,如何能够有效抵御量子攻击就成了不得不面对的问题之一。

Authing的博客 1773

当网络安全成为业务增长的重要保障,企业应该如何应对?

企业需要关注的网络安全层面有哪些?企业管理者又应如何应对网络安全问题,准确制定企业安全策略呢?

Authing的博客 1733

七部门重磅发文!未来产业创新该如何发展?

如何确保产业数字安全基础上,加快发展未来产业,支撑推进企业创新发展?

Authing的博客 1026

Authing 身份云入选崔牛会「2024 中国企业服务云图」

提供 OPA(组织过程管理) SaaS ,完善 OPA 计算监控、事件监控、决策监控、决策设计器、代码编写等,覆盖决策计算全生命周期,实现事件驱动的低代码决策引擎和自动化风控引擎。Authing 目前已经服务包括可口可乐、招商银行、三星集团、复星集团、万科集团、海底捞在内的 40000+ 企业和开发者。2024 版云图汇聚了时下国内 3500+ 家数字化领域内优秀的 To B 企业,涵盖技术支撑、数据资产、协同办公、垂直行业等 18 个类别,覆盖万亿级市场,堪称中国企业数字化选型的“宝典”,

Authing的博客 750

管理员分级管控三大模式,提高企业内部管理效率

企业在整个权限管理落地过程中,如何解决这些难题,提高企业内部管理效率?

Authing的博客 2057

零信任网络标准发布,企业如何构建下一代可信任的身份安全体系?

在这样的背景下,企业如何构建下一代可信任的身份安全体系?

Authing的博客 1303

克服数字化三重担忧,从构建身份基础设施开始

如何消除三重担忧,成为企业数字化转型之路的重中之重。

Authing的博客 955

AI 欺诈事件频出,如何重塑身份认证的安全性?

人工智能时代的到来,将不仅仅是科技盛宴,更是信息安全对网络威胁的一次攻坚战。

Authing的博客 1386

教育信创全面加速,如何促进高校信息化建设?

教育数字化转型不是针对一般教育设施的简单更新升级,而是针对整个教育体系的深层次积累,引领教育行业从传统的教育模式向智能化教育迈进,形成适应数字时代的全新教育形态。

Authing的博客 1928

Authing 入选中国信通院《 2023 高质量数字化转型产品及服务全景图》

近日,中国信通院“铸基计划”发布了《高质量数字化转型产品及服务全景图( 2023 )》。Authing 身份云成功入选 IT 维护与运营领域并获得证书。

Authing的博客 704

第三方 Cookie 被禁用?企业该如何实现用户精准运营和管理?

如何收集和利用第一方数据填补第三方 Cookie 的空白,成为许多企业和营销人员需要重新思考的问题。

Authing的博客 1331

从密码认证到 Passkey 无密码,告别传统密码时代

Authing 作为国内领先的身份认证服务商,率先推出 Passkey 无密码认证服务,填补国内密码认证缺陷,降低数据泄漏风险。

Authing的博客 1566

Authing 受邀参加 2023 QCon 全球软件开发大会

Authing 作为身份领域领先企业受邀参加此次大会,与客户深度对话塑造数字化发展未来。

Authing的博客 695

2023 年最先进认证方式上线,Authing 推出 Passkey 无密码认证

密码这一传统身份认证方式已经难以得到可靠的认证保障,随之出现各种新身份认证方式,其中就包括无密码身份认证。

Authing的博客 1554

Authing 分级管理员重磅上线,实现权限超细粒度分级管

为了满足企业内部复杂的组织架构设计需求,企业需要实现“统一管理,分级授权”的权限管理模式,满足企业内部不同角色的需求,提高了整体管理的透明度和可操作性。

Authing的博客 1585

身份自动化工作流,帮助您快速提高工作效率

身份自动化不仅仅简单将手动步骤数字化,更是将企业从传统、低效、甚至过时的工作流程中解放出来,形成数字化引擎,将企业的管理方式从繁琐转变为简洁,从手动迈向自动,为整个组织注入了新的活力。

Authing的博客 1210

从身份治理出发,助力教育行业回归教育本质

在实施国家教育数字化战略行动中,如何利用数字技术优势助力教育治理变革,提升区域、学校教育治理水平成为深化教育改革的一个热点话题。

Authing的博客 1193

身份管理如何提升中小企业生产力?

在此困局中,企业希望依托数字化以求业务增长、人员增效、企业扩张以及产品核心竞争力的稳固。

Authing的博客 1025

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

当前形势下,我国制造业发展之路该如何走?

Authing的博客 1680

Authing CEO 谢扬来信 |我的原则

从忙碌的工作中短暂抽身,有很多感想,不吐不快,借此机会,倾我所有,诉我原则。

Authing的博客 1165

从 RBAC 到 NGAC ,企业如何实现自动化权限管理?

谁具有特定数据的访问权限?您的企业是否实现了对员工权限的有效管理?

Authing的博客 2205

如何为您的企业选择合适的多因素认证?

如何评估企业的 MFA 需求,如何选择合适的 MFA 解决方案?这些都成为企业在如今安全环境下需要思考的问题。

Authing的博客 1266

放弃无谓的「技术氛围」幻想,准备战斗

资本绝不会做亏本买卖,一家公司在市场中的一切动作都以盈利为目的。

Authing的博客 225

Authing 入选《 2023 年央国企信创应用与实践研究报告》优秀服务商

Authing 身份云作为国内唯一事件驱动云原生身份平台入选《 2023 年央国企信创应用与实践研究报告》优秀服务商。

Authing的博客 728
上一篇: 张小龙对微信思考最深刻的地方
下一篇: 产品双周动态(1.17-1.30)
Authing
Authing 企业官方账号 企业官方账号
博客等级 码龄6年 863粉丝 304原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值