如何将BI 工具与业务系统进行单点登录对接,实现用户权限通用

如何,bi,工具,业务,系统,进行,单点,登录,对接,实现,用户,权限,通用 · 浏览次数 : 69

小编点评

**用户权限控制模块的实现** 本文介绍了 Wyn 用户权限控制模块的实现方法,包括用户登录、获取用户信息、获取用户权限、获取用户组织机构和获取用户上下文等功能。 **用户登录** 用户登录接口使用第三方业务系统账号进行处理,并获取用户信息。 **获取用户信息** - 用户信息通过编码加密方式直接存为 token。 - 用户信息放到内存(redis)Map(dict)容器中,token即为对应键值对的key,后续通过 get(key) 的方式来获取用户信息。 **获取用户权限** - 用户权限通过用户上下文对象中的 User 对象实现。 **获取用户组织机构** - 用户组织机构通过用户上下文对象中的 UserContext 对象实现。 **获取用户上下文** - 用户上下文对象包含了用户ID、用户名称等信息。 **其他配置项** - 用户配置项可以通过 ISecurityProvider 方法中获取。 - 可根据需要添加其他自定义参数。 **示例** ```python # 获取用户权限 user_context = get_user_context() permissions = user_context.permissions # 获取用户组织机构 organization_id = get_user_organization_id() ```

正文

本文由葡萄城技术团队于博客园原创并首发
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

首先来看下两套系统的用户体系功能,左边是BI 工具,右边是业务系统,需要实现用户权限对接和打通:

单点登录体系及用户场景

• 场景1. 用户登录Wyn BI页面使用第三方业务系统账号
• 场景2. 用户使用第三方账号登录wyn BI以后需要获取用户信息(包括组织机构、用户上下文)
• 场景3. 用户在第三方页面调用wyn BI登录接口,获取wyn BI的登录token

Wyn BI安全提供程序接口




ISecurityProvider

• GenerateTokenAsync 生成用户token的核心方法(也是校验用户的核心方法)
• ValidateTokenAsync 校验用户token
• DisposeTokenAsync 注销用户token
• GetUserRolesAsync 获取用户权限
• GetUserOrganizationsAsync 获取用户组织机构
• GetUserDescriptorAsync 获取用户描述
• GetUserContextAsync 获取用户上下文

ISecurityProviderFactory

• CreateAsync 根据外部配置生成ISecurityProvider

IExternalUserContext

• GetValueAsync 获取用户上下文单值属性
• GetValuesAsync 获取用户上下文多值属性

IExternalUserDescriptor

• ExternalUserId 用户ID
• ExternalUserName 用户名称
• ExternalProvider

可以看到Wyn 提供的这几个接口,指的就是Wyn的用户权限控制模块。

前置配置

当对接Wyn权限体系使用 数据库或 API接口等方式时,往往希望能把关键接口地址 或者数据库配置信息能在前端显示修改, 这样能方便后续修改该配置而不用再修改代码。

关于配置项在前端往往显示为 key:value 形式, 表现为代码层面就是 ISecurityProviderFactory 工厂类的 SupportedSettings 属性,不难看出 SupportedSettings 类型便是 ConfigurationItem 的数组(可迭代)形式, 一般可把需要设置的setting key 通过硬编码的方式赋给 SupportedSettings 对象,来完成配置项对接。

ISecurityProviderFactory 该工厂类的 CreateAsync 方法便是安全提供程序的初始化入口, 在这里可以将外部配置信息通过 ConfigurationItem 对象来注入安全提供程序中, 以便后续查询用户信息使用。

场景1

由上图可以看出整个 Wyn 登录的接口入口函数就是 GenerateTokenAsync 函数来生成token,该函数的参数就是用户登录输入的用户名称、密码 (其他参数,场景3细讲), 最后产生结果就是一条用户token,这个token 可以理解为用户在wyn 中的当前用户信息索引。

从校验token信息之后的所有函数方法参数都是这条生成的token,所以易知后面的获取用户上下文、用户信息描述、用户权限、用户组织机构. 它们的基本思路都是 token 索引-->获取用户信息-->由用户信息构建要获取的对象(上下文、组织机构......)--> 返回获取对象。

这里构建token的方法没有规定,所以可以使用多种方法来生成token。

• 将用户信息通过编码加密方式直接存为token,后续获取用户信息直接反向解密即可拿到
• 将用户信息放到内存(redis)Map(dict)容器中,token即为对应键值对的key,后续通过 get(key) 的方式来获取用户信息
• 将第三方查询该用户信息的关键参数如 userId, userName 等参数编码为token, 后续通过解密为查询参数然后重新查询用户信息来获取

场景2

显而易见,IExternalUserContext 实际上就是用户信息的访问器, 指定的访问器方法分别是 GetValueAsync 和 GetValuesAsync . 这两个分别对应单值参数和多值参数, 通常情况下, 都会在 UserContext 对象中内置一个 User 对象来实现上述两个访问器的实现逻辑。当然在构建 UserContext 时,用户对象就要建立好, 这个就不赘述了。

IExternalUserDescriptor 类似, 但是因为它的访问属性是固定的,包含了用户id、用户名称等三个属性, 所以没必要再内置 user 对象, 直接构建 IExternalUserDescriptor 对应属性即可

场景3

获取token接口

// curl 调用
curl --location --request POST 'http://localhost:51980/connect/token'
--header 'User-Agent: Apifox/1.0.0 (https://www.apifox.cn)'
--data-urlencode 'username='
--data-urlencode 'password='
--data-urlencode 'grant_type=<grant_type>'
--data-urlencode 'client_id=<client_id>'
--data-urlencode 'client_secret=<client_secret>'
--data-urlencode 'tenant_path=<tenant_path>'
--data-urlencode 'access-token-lifetime='

//javascript fetch 代码
var myHeaders = new Headers();
myHeaders.append("Content-type", "application/x-www-form-urlencoded");

var urlencoded = new URLSearchParams();
urlencoded.append("username", "");
urlencoded.append("password", "");
urlencoded.append("grant_type", "<grant_type>");
urlencoded.append("client_id", "<client_id>");
urlencoded.append("client_secret", "<client_secret>");
urlencoded.append("tenant_path", "<tenant_path>");
urlencoded.append("access-token-lifetime", "");

var requestOptions = {
method: 'POST',
headers: myHeaders,
body: urlencoded,
redirect: 'follow'
};

fetch("http://localhost:51980/connect/token", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));

// axios 调用
var axios = require('axios');
var qs = require('qs');
var data = qs.stringify({
'username': '',
'password': '',
'grant_type': '<grant_type>',
'client_id': '<client_id>',
'client_secret': '<client_secret>',
'tenant_path': '<tenant_path>',
'access-token-lifetime': ''
});
var config = {
method: 'post',
url: 'http://localhost:51980/connect/token',
headers: {
"Content-type" : "application/x-www-form-urlencoded"
},
data : data
};

axios(config)
.then(function (response) {
console.log(JSON.stringify(response.data));
})
.catch(function (error) {
console.log(error);
});

以上是 curl 和 javascript fetch/axios 调用获取token的方法, 接下来对参数内容加以说明:
• username 用户名 必填
• password 密码 必填
• grant_type 定值 "password" 必填
• client_id 客户端id 访问 客户端管理 可查询 或 查询 帮助文档 必填
• client_secret 客户端私钥 访问 客户端管理 可查询 或 查询 帮助文档 必填
• tenant_path 组织机构角色参数,形如 /A$1/B$2/C$3 表示 A部门1角色下的B部门2角色下的C部门3角色 选填
• access-token-lifetime token过期时间,单位秒 选填
这部分实际上只是第三方调用Wyn接口的场景,按场景1,场景2的内容开发完理应可以直接适应场景3的, 但需要有几个额外注意的点:

  1. tenant_path 这个参数表示的是组织机构角色参数, 也就是说这个场景下可能出现用户和 Wyn中的组织机构通过这个参数来绑定, 所以在生成 token的方法中也需要额外增加处理。tenant_path 参数并将其和用户信息进行绑定, 以便在后面的获取组织机构方法 GetUserOrganizationsAsync 中使用。
  2. 额外参数, 除了上面接口中的参数之外, 也可以添加其他自定义参数,以供生成token 方法中使用,具体值可以从customizedParam 中拿到。
    var externalParams = customizedParam as Dictionary<string, string>; string externalParam = externalParams["key"]

代码建议
在 ISecurityProvider 方法中可能需要查询数据库、调用 API、调用SDK 的方式来获取第三方的用户信息, 这里建议加一层抽象的 service 功能层供 ISecurityProvider 调用使用, 在 service 层下层在添加连接数据库或者调用 API 的基础查询层, 这一层内容与业务代码完全无关, 只专注于实现后台基础的查询功能。

与如何将BI 工具与业务系统进行单点登录对接,实现用户权限通用相似的内容:

如何将BI 工具与业务系统进行单点登录对接,实现用户权限通用

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 首先来看下两套系统的用户体系功能,左边是BI 工具,右边是业务系统,需要实现用户权限对接和打通: 单点登录体系及用户场景 • 场景1. 用户登录Wyn BI页面使用第三

增强金蝶云星空的数据分析能力,实现BI 分析功能

小编最近在研究金蝶云星空中如何将已有的BI 工具 集成进去,对于BOS开发毫无经验的我,就这么开始了从0到1的过程。在实现功能过程中,也踩了很多坑,接下来看如何避坑。 那么具体如何实现,根据下面的步骤来看。 话不多说直接上操作步骤,篇幅较长,这是一篇教程贴,分享给需要的用户 1. 开发环境要求 【操

BI数据工具如何助力碳中和,绿色解决方案来袭

本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 随着“双碳”逐步由部分国家呼吁转变为全球主要国家的目标,绿色低碳的意义不仅体现在解决环境问题的物理意义上,还体现在推动能源结构转型的社会经济意义上。长期目标是将全球平均气

BI工具术语表大全:从字母A-Z全面收录

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 谈到商业智能行业,变革是不可避免的。为了跟上步伐,各种各样的BI 解决方案正在快速迭代更新,以满足企业的数字化需求,那么市场上BI工具种类繁杂,到底如何选择适合功能全面

如何使用自助式商业智能 (BI) 避免组织中的数据孤岛

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 许多组织都存在数据问题。当许多员工远程工作(或在混合环境中)并在多个位置使用多个设备访问公司数据时,他们正在处理信息过载问题。这只会加剧数据孤岛的问题。 数据孤岛正是它

Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了!

Power BI进阶秘籍,干货满满!如何将度量值转化为切片器(动态切换分析指标),实操指南来了! 想要在Power BI中让度量值也能像维度一样灵活筛选?没问题,这里就为你揭秘如何将度量值转化为切片器(动态切换分析指标)的实用方法! 一、了解基础:首先,要知道Power BI原生不支持直接将度量值作

BI系统打包Docker镜像及部署的技术难度和实现

BI系统打包Docker镜像及部署的技术难度和实现 随着容器化技术盛行,Docker在前端领域也有着越来越广泛的应用;传统的前端部署方式需要我们将项目打包生成一系列的静态文件,然后上传到服务器,配置nginx文件;如果我们使用容器化部署,将部署操作都命令化,集中成一个脚本就可以完成原来复杂的部署过程

企业如何从0到1搭建BI系统

在进行BI系统搭建之前,有两个问题一定是大家思考最为深入的: 1、 为什要搭建BI系统? 2、 搭建BI系统能解决什么问题? 我们搭建的信息化系统运行了一段时间之后,来自各个业务系统的订单、库存、交易账目、客户和供应商等都会积累产生大量数据,来自企业所处行业和竞争对手的数据以及来自企业所处的其他外部

腾讯云 BI 数据分析与可视化的快速入门指南

通过本文的介绍,我们了解了腾讯云 BI 这款商业智能解决方案的基本功能和应用场景。从创建项目、连接数据源、数据表建模到页面搭建和推送功能的设置,我们通过一个互联网运营看板的案例,展示了如何快速入门并利用腾讯云 BI 进行数据分析和可视化。通过简单的数据编辑,我们可以轻松地设计报表,并实现数据的可视化...

如何将文本转换为向量?(方法三)

​ 文本转换为向量有多种方式: 方法一:通过模型服务灵积DashScope将文本转换为向量(推荐) 方法二:通过ModelScope魔搭社区中的文本向量开源模型将文本转换为向量 方法三:通过Jina Embeddings v2模型将文本转换为向量 方法四:通过百川智能向量化模型将文本转换为向量 本文