Authing 知识库
🛠 开发资源🥂 集成案例🔭 常见问题🖥 控制台
3.0.0
3.0.0
  • 欢迎
  • Authing 概述
  • 快速开始
    • 注册 Authing 开发者账号
    • 第一个应用
    • 基础概念
    • 实现单点登录
    • 控制台概览
    • 部署模型和价格
    • 最佳开发实践
    • 我该如何选择 Authing 的技术
  • 进阶指南
    • 理解认证和授权
      • 用户名 - 密码认证
      • 邮箱 - 密码认证
      • 手机 - 验证码认证
      • JWT Token 释义及使用
    • 验证 Token
    • 配置用户权限
    • 迁移老数据进 Authing
    • 错误代码
  • 认证
    • 接入 OAuth 2.0
      • 创建 OAuth 应用
      • 使用 OAuth 授权
    • 接入 OpenID Connect
      • 创建 OIDC 应用
      • 使用 OIDC 授权
      • 理解 OIDC 流程
      • OIDC 常见问题
    • 接入 SAML
      • 创建 SAML Identity Provider 应用
      • 创建 SAML Service Provider 应用
      • 理解 SAML 流程
      • 同时使用 Authing 作为 SP 和 IdP
      • 使用 SAML Identity Provider
        • 在阿里云访问管理中使用
        • 在腾讯云访问管理中使用
        • 在 Auth0 中使用
      • 使用 SAML Service Provider
        • 与 Auth0 SAML IdP 对接
        • 与 SSOCircle SAML IdP 对接
    • 接入 LDAP
      • 配置 LDAP 服务
      • 使用 Authing 的 LDAP 用户目录
    • 接入 Active Directory
  • 社会化登录
    • 接入 Web 端社会化登录
      • GitHub 登录
      • 微信 PC 扫码登录
      • 微信 APP 内网页登录
      • 企业微信(第三方应用)网页授权登录
      • 企业微信(第三方应用)扫码登录
      • 企业微信(企业内部)扫码登录
      • 新浪微博登录
      • 钉钉登录
      • QQ 登录
      • 配置登录授权 Scope
    • 接入移动端社会化登录
      • 微信登录
      • 支付宝登录
    • 接入小程序登录
      • 小程序登录
        • 用户登录凭证(code)最佳实践
      • APP 拉起小程序登录
    • 打通微信账号体系
  • 扫码登录
    • 小程序扫码登录
      • 接入私有化小程序
    • APP 扫码登录
      • 快速接入
      • Web 端 SDK
      • 完整接口列表
      • 自定义配置项
      • 扫码登录原理
  • 移动应用登录
    • 移动应用 SSO
      • 自动检测登录
      • 唤起 App 登录
    • 移动应用身份提供商
  • 授权
    • Authorization 基础概念
      • 什么是基于角色的管理(RBAC)
      • 什么是基于属性的管理(ABAC)
      • 什么是零信任网络
    • Authorization at Authing
    • 接入 RBAC
    • 接入 ABAC
    • 接入组织机构管理
  • 扩展能力
    • 自定义认证流程(Pipeline)
      • 创建你的第一个 Pipeline 函数
      • Pipeline 函数开发指南
      • 应用场景
      • user 对象
      • context 对象
      • 使用环境变量
      • 可用的 Node Modules
      • 如何调试
      • Node SDK
      • GraphQL API
      • 常见问题
      • 私有化部署
    • 使用 Webhook
    • 自定义用户字段
  • 开发资源
    • 开发资源
    • API(GraphQL)
    • Guard for Web
      • 自定义 Guard 的 UI 样式
    • Guard for Mobile
      • Guard for React Native
    • Guard VS 自定义 UI
    • SDK for 单点登录
    • SDK for JavaScript
      • 查询用户权限
      • 绑定社会化登录
      • 自定义用户字段
      • 管理 MFA 口令
      • 自定义请求链接
    • SDK for Node.js
      • 权限控制
      • 查询用户权限
      • 组织机构管理
      • 老版权限控制(deprecated)
      • Pipeline 函数
      • 自定义用户字段
      • 绑定社会化登录
      • 管理 MFA 口令
      • 自定义请求连接
    • SDK for React Native
    • SDK for 微信小程序
    • SDK for Java
    • SDK for Objective-C
    • SDK for Python
    • SDK for Go
    • SDK for PHP
    • 函数计算(FaaS)
  • 通信
    • 邮件
    • SMS
  • MFA
    • 配置 MFA 安全口令
      • 使用 Microsoft Authenticator 添加 MFA 令牌
    • 接入 MFA
  • 安全
    • 配置 Web 安全域
    • 配置用户池密码强度
    • 配置密码加密函数
  • 其他
    • 常见问题
    • 集成案例
      • Authing 与 AWS 集成案例
      • 函数计算与 AaaS 集成案例
      • Odoo 集成案例
      • 社会化登录集成案例
    • 社交互联数据
    • 为 Authing 贡献 SDK
      • 了解 Authing 的模块
Powered by GitBook
On this page
  • 非凡科技有限公司背景介绍
  • 使用 Authing 完成组织机构管理
  • 梳理组织机构节点
  • 创建组织机构
  • 加入产品部及其子部门节点
  • 以此类推,加入所有节点
  • 查看最新组织机构结构
  • 如何向组织机构中添加用户和配置权限
  • 为组织机构节点配置权限
  • 向组织机构节点添加用户
  • 查询用户具备的权限
  • 总结

Was this helpful?

  1. 授权

接入组织机构管理

Previous接入 ABACNext自定义认证流程(Pipeline)

Last updated 5 years ago

Was this helpful?

借助 Authing,可以快速。简单来说,RBAC 指的是通过用户的角色(Role)赋予其相关权限,这实现了细粒度的访问控制,并提供了一个相比直接授予单个用户权限,更简单、可控的管理方式。

而在现实生活中,组、角色往往是分层嵌套的,呈树状结构,最常见的就是组织机构,如公司、学校等等。这篇文章,我们会设想一家互联网公司 —— 「非凡科技有限公司」,看看他们是如何使用 Authing 快速完成组织机构建模的。

非凡科技有限公司背景介绍

我们假设有一家名为「非凡科技有限公司」的机构,约 300 名员工,他们想使用 Authing 对其组织机构进行建模、管理。

非凡科技有限公司的公司架构如下:

  • 一级部门有产品部、研发部、运营部、综合管理部

  • 一级部门下面又有二级部门,如产品部中包含产品经理和设计等。

这是一个典型的树状结构,其中有且仅有一个根节点,一般而言,根节点就是一家公司、一个组织。每个节点对应一个分层的部门。

这里有一点需要注意:在 Authing 中,这样的节点对应的是一个 Group,一个 Group 可以拥有多个角色(Role),一个角色包含一个或多个权限(Permission);而一个 Group 由若干用户(User)组成,某个 Group 中的用户会继承该 Group 下的所有角色,从而具备相关权限。

在 Authing 中,组织机构(Org)是一组树状的 Group 集合,而 Org 的节点(Node)本质上就是一个 Group。

了解如何管理 Group 中的 User、如何管理 Group 中的 Role、如何配置 Role 的 Permission,请见:

了解如何查询单个用户的 Group, Role, Permission 列表,请见:

使用 Authing 完成组织机构管理

本文中用到的 createGroup,createRole 等为封装的方法,如下所示。

本文使用 Node.JS SDK 演示,具体接口请参考:

非 JavaScript 开发者请使用 API 调试器:

import Authing from 'authing-js-sdk'

const authing = new Authing({
    userPoolId: 'your_user_pool_id',
    secret: 'your_user_pool_secret',
})

async function createGroup(name, description) {
  name = name || `分组${Math.random().toString(36).slice(2)}`
  description = description || ""
  return await authing.authz.createGroup({
    name,
    description
  })
}

async function createRole(name, description) {
  name = name || `角色${Math.random().toString(36).slice(2)}`
  description = description || ""
  return await authing.authz.createRole({
    name,
    description
  })
}

async function createPermission(name, description) {
  name = name || `权限${Math.random().toString(36).slice(2)}`;
  description = description || ""
  return await authing.authz.createPermission({
    name,
    description
  })
}

async function createPermissionBatch(permissions) {
  let list = []
  for (let name of permissions) {
    list.push(await createPermission(name))
  }
  return list
}

async function createUser() {
  return await authing.register({
    email: Math.random()
      .toString(36)
      .slice(2) + "@authing.cn",
    password: "123456a"
  });
}

梳理组织机构节点

首先,我们需要列举出该组织结构拥有的所有节点:

  • 非凡科技有限公司

  • 产品部

  • 研发部

  • 运营部

  • 综合管理部

  • 产品经理

  • 设计

  • 开发

  • 测试

  • 运维

  • 用户运营

  • 渠道运营

  • HR

  • 财务

  • 行政

这些节点在 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
})

加入产品部及其子部门节点

接着插入产品部的各级节点:

这里需要指定以下参数:

  • 组织机构 ID

  • 该节点对应的 Group ID

  • 该节点的父节点的 Group 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)

tree 数据如下所示:

如何向组织机构中添加用户和配置权限

前面说过,Authing 中一个组织结构节点对应一个 Group,对此我们提供了完整的 SDK。

为组织机构节点配置权限

相关 API 见:

非凡科技有限公司的所有员工,都具备开具发票、使用公司邮箱的权限。与此对应,在此我们创建两个角色:Invoice Submitter 和 Corp Email User。

其中 Invoice Submitter 具备以下权限:

  • invoice:login

  • invoice:create

  • invoice:query

  • invoice:list

  • invoice:delete

Corp Email User 具备以下权限:

  • corp-email:login

  • corp-email:send

  • corp-email:receive

  • corp-email:list

  • corp-email:detail

这可以通过以下代码完成:

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
})

向组织机构节点添加用户

相关 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"

总结

本文我们以「非凡科技有限公司」为例,介绍了如何将一棵组织机构树转换成一组嵌套、有层次的 Group。通过 Authing 提供的分组角色权限管理 API,可以为 Group 配置角色、指派成员,使得该 Group 中的用户继承所需的权限,从而完成组织机构建模与权限控制。

参见此测试用例:

权限控制
查询用户权限
https://github.com/authing/authing.js/blob/master/tests/org.js
组织机构管理
权限控制
权限控制
查询用户权限
实现基于角色的访问控制(RBAC)
https://authing.cn/graphiql/authing.cn