借助 Authing,能够快速实现基于角色的访问控制(RBAC)。简单来讲,RBAC 指的是经过用户的角色(Role)赋予其相关权限,这实现了细粒度的访问控制,并提供了一个相比直接授予单个用户权限,更简单、可控的管理方式。node
而在现实生活中,组、角色每每是分层嵌套的,呈树状结构,最多见的就是组织机构,如公司、学校等等。这篇文章,咱们会设想一家互联网公司 —— 「非凡科技有限公司」,看看他们是如何使用 Authing 快速完成组织机构建模的。git
该公司约 300 名员工,其公司架构大体以下:github
这是一个典型的树状数据结构,有且仅有一个根节点,以及多个分层的节点。通常而言,根节点就是一家公司、一个组织,其余的每一个节点都对应一个部门。segmentfault
这里有一点须要注意:在 Authing 中,这样的节点对应的是一个 Group,好比「非凡科技有限公司」是一个 Group,「产品部」也是一个 Group。咱们要作的,是要把这些 Group 放到他在树上所属的位置。安全
一个 Group 能够拥有多个角色(Role),一个角色包含一个或多个权限(Permission);而一个 Group 由若干用户(User)组成,某个 Group 中的用户会继承该 Group 下的全部角色,从而具有相关权限。数据结构
了解如何管理 Group 中的 User、如何管理 Group 中的 Role、如何配置 Role 的 Permission,请见文档:角色权限管理。架构
了解如何查询单个用户的 Group, Role, Permission 列表,请见文档:查询用户权限。app
如何使用 Authing 完成组织机构管理运维
首先,咱们须要列举出该组织结构拥有的全部节点:测试
这些节点在 Authing 中都是一个 Group,因此须要先建立这些 Group:
const 非凡科技有限公司 = await createGroup("非凡科技有限公司") const 产品部 = await createGroup('产品部') const 产品经理 = await createGroup('产品经理') const 设计 = await createGroup('设计') const 研发部 = await createGroup('研发部') const 开发 = await createGroup('开发') const 测试 = await createGroup('测试') const 运维 = await createGroup('运维') const 运营部 = await createGroup('运营部') const 用户运营 = await createGroup('用户运营') const 渠道运营 = await createGroup('渠道运营') const 综合管理部 = await createGroup('综合管理部') const HR = await createGroup('HR') const 财务 = await createGroup('财务') const 行政 = await createGroup('行政')
接着建立组织机构(一组树状的 Group),这须要指定根节点对应的 Group:
let org = await authing.org.createOrg({ rootGroupId: 非凡科技有限公司._id })
接着插入产品部的各级节点:
这里须要指定如下参数:
如加入产品部节点时,groupId 为 Group<产品部> 的 ID,parentGroupId 为 Group<非凡科技有限公司> 的 ID。
await authing.org.addNode({ orgId: org._id, groupId: 产品部._id, parentGroupId: 非凡科技有限公司._id }) await authing.org.addNode({ orgId: org._id, groupId: 产品经理._id, parentGroupId: 产品部._id }) await authing.org.addNode({ orgId: org._id, groupId: 设计._id, parentGroupId: 产品部._id })
研发部:
// 添加研发部 await authing.org.addNode({ orgId: org._id, groupId: 研发部._id, parentGroupId: 非凡科技有限公司._id }) await authing.org.addNode({ orgId: org._id, groupId: 开发._id, parentGroupId: 研发部._id }) await authing.org.addNode({ orgId: org._id, groupId: 测试._id, parentGroupId: 研发部._id }) await authing.org.addNode({ orgId: org._id, groupId: 运维._id, parentGroupId: 研发部._id })
运营部:
await authing.org.addNode({ orgId: org._id, groupId: 运营部._id, parentGroupId: 非凡科技有限公司._id }) await authing.org.addNode({ orgId: org._id, groupId: 用户运营._id, parentGroupId: 运营部._id }) await authing.org.addNode({ orgId: org._id, groupId: 渠道运营._id, parentGroupId: 运营部._id })
综合管理部:
// 添加综合管理部 await authing.org.addNode({ orgId: org._id, groupId: 综合管理部._id, parentGroupId: 非凡科技有限公司._id }) await authing.org.addNode({ orgId: org._id, groupId: HR._id, parentGroupId: 综合管理部._id }) await authing.org.addNode({ orgId: org._id, groupId: 财务._id, parentGroupId: 综合管理部._id }) await authing.org.addNode({ orgId: org._id, groupId: 行政._id, parentGroupId: 综合管理部._id })
到如今,咱们的非凡科技有限公司组织机构见建模完成了,是时候获取其最新的树状结构了:
const { tree } = await authing.org.findById(org._id)
前面说过,Authing 中一个组织结构节点对应一个 Group,对此咱们提供了完整的 SDK。
相关 SDK 见:角色权限管理。
非凡科技有限公司的全部员工,都具有开具发票、使用公司邮箱的权限。与此对应,在此咱们建立两个角色:Invoice Submitter 和 Corp Email User。
其中 Invoice Submitter 具有如下权限:
Corp Email User 具有如下权限:
这能够经过如下代码完成:
const InvoiceSubmitter = await createRole('Invoice Submitter') let permissions = await createPermissionBatch(['invoice:login', 'invoice:create', 'invoice:query', 'invoice:list', 'invoice:delete']) await authing.authz.addPermissionToRoleBatch({ roleId: InvoiceSubmitter._id, permissionIdList: permissions.map(x => x._id) }) const CorpEmailUser = await createRole('Corp Email Use') permissions = await createPermissionBatch(['corp-email:login', 'corp-email:send', 'corp-email:receive', 'corp-email:list', 'corp-email:detail']) await authing.authz.addPermissionToRoleBatch({ roleId: CorpEmailUser._id, permissionIdList: permissions.map(x => x._id) })
接着让 Group 非凡科技有限公司具有 Invoice Submitter 和 Corp Email User 两个角色:
await authing.authz.addRoleToGroup({ roleId: InvoiceSubmitter._id, groupId: 非凡科技有限公司._id }) await authing.authz.addRoleToGroup({ roleId: InvoiceSubmitter._id, groupId: 非凡科技有限公司._id })
如今,非凡科技有限公司这个节点将会具有 Invoice Submitter 和 Corp Email User 两个角色
相关 API 见:角色权限管理。
某个 Group 内的用户会继承该 Group 内全部角色的权限(若是有重叠,将会取并集)。
下面咱们往用户池中注册新用户,而后将其加入非凡科技有限公司 Group 中:
const user = await createUser() await authing.authz.addUserToGroup({ groupId: 非凡科技有限公司._id, userId: user._id })
相关 API 见:查询用户权限。
const { rawList: permissionList } = await authing.userPermissionList(user._id)
permissionList 以下:可见,此用户已经继承了 Invoice Submitter 和 Corp Email User 两个角色的全部权限:
[ 'invoice:login', 'invoice:create', 'invoice:query', 'invoice:list', 'invoice:delete', 'corp-email:login', 'corp-email:send', 'corp-email:receive', 'corp-email:list', 'corp-email:detail', ]
开发者拿到用户权限列表以后,能够在业务代码层判断用户是否具有某一特定权限,如:
if "corp-email:login" not in user.permissionList: return "Permission Denied"
更多关于 RBAC 的介绍请参考实现基于角色的访问控制(RBAC)。
本文咱们以「非凡科技有限公司」为例,介绍了如何将一棵组织机构树转换成一组嵌套、有层次的 Group。经过 Authing 提供的分组角色权限管理 API,能够为 Group 配置角色、指派成员,使得该 Group 中的用户继承所需的权限,从而完成组织机构建模与权限控制。
重磅:Authing 将于2020 Q1 开源,欢迎 Star 关注 https://github.com/Authing/authing
Authing 提供专业的身份认证和受权服务。
咱们为开发者和企业提供用以保证应用程序安全所需的认证模块,这让开发人员无需成为安全专家。
你能够将任意平台的应用接入到 Authing(不管是新开发的应用仍是老应用均可以),同时你还能够自定义应用程序的登陆方式(如:邮箱/密码、短信/验证码、扫码登陆等)。
你能够根据你使用的技术,来选择咱们的 SDK 或调用相关 API 来接入你的应用。当用户发起受权请求时,Authing 会帮助你认证他们的身份和返回必要的用户信息到你的应用中。
![]()
<div align=center>Authing 在应用交互中的位置</div>