DBAPI 实现不同角色控制查看表的不同列

场景说明

在数据库管理系统中,对表进行列级别的权限控制是一项关键的安全措施,特别是在处理敏感数据或需要遵守特定数据访问控制策略的情况下。合理的列权限控制不仅能保护敏感信息,还能帮助组织满足合规性要求。

以下是一些典型的应用场景:

敏感数据保护

当表中包含敏感信息(如个人身份信息、财务数据、医疗记录等)时,通过列权限控制,只允许特定角色或用户访问这些列,可以有效防止数据泄露,降低数据安全风险。

合规性要求

某些行业或地区有严格的数据保护法规(如 GDPR、HIPAA 等),要求对敏感数据的访问进行严格控制。列权限控制可以帮助组织满足这些合规性要求,避免因数据泄露而面临的法律风险。

数据分层访问

在大型企业中,不同部门或用户角色可能只需要访问表中的部分列。通过列权限控制,可以确保用户只能访问其工作所需的列,实现最小权限原则,减少不必要的数据访问风险。

实现方案

DBAPI 提供了 API 编排、动态 SQL、数组传参的功能,通过这些功能,可以实现列权限控制。
为了实现列权限可以动态配置,我们采用以下方案:

  1. 动态权限配置:在数据库中维护一张权限配置表,用于配置不同用户可以访问的列,便于权限信息的动态修改。
  2. API 编排实现:创建两个独立的 API,并通过编排顺序执行。第一个 API 查询用户拥有的权限列,第二个 API 根据这些权限列查询表数据。

实施示例

1. 创建商品信息表

首先准备一张商品信息表 products,包含以下列:

字段名类型说明
idint商品 ID
namevarchar商品名称
descriptiontext商品描述
categoryvarchar商品分类
costdecimal进货成本(敏感数据)
suppliervarchar供应商(敏感数据)

示例数据如下:

idnamedescriptioncategorycostsupplier
1iPhone 13 Pro高性能手机手机9999apple
2MacBook Pro性能 Strong电脑19999apple
3Mate 60高性能手机手机6999华为

其中,商品的进货成本 cost 列和供应商 supplier 列为保密数据,需要根据用户的角色进行权限控制。

2. 创建权限配置表

创建权限配置表 permission_config,用于记录用户对表列的权限信息:

字段名类型说明
user_idbigint用户 ID
table_namevarchar表名
column_namevarchar列名

示例数据如下:

user_idtable_namecolumn_name
1productscost
1productssupplier
2productssupplier

3. 创建查询用户权限列的 API

创建 API,配置参数 userid,类型为 bigint,SQL 查询语句如下:

SELECT column_name FROM permission_config WHERE user_id = #{userid} and table_name = 'products'

API配置界面
参数配置界面

该 API 用于获取指定用户有权访问的所有列名。

数据格式转换

配置完成后,我们进行请求测试,发现返回的数据格式为:

{"data": [{ "column_name": "cost" }, { "column_name": "supplier" }],"msg": null,"success": true
}

测试结果

但实际上我们期望的数据格式是简洁的数组形式:["cost", "supplier"]

为了实现这一目标,我们需要对 API 返回的数据进行格式转换。在 API 配置中找到"全局插件 - 数据转换"选项,填写以下 Groovy 脚本:

data.data.collect { it.column_name }

这段 groovy 代码的意思是将返回的数据中的 data 属性进行循环, 提取每个元素的column_name 字段,并返回一个包含这些提取值的数组。

并将脚本语言选择为 Groovy

数据转换配置

配置完成后保存 API,并再次进行请求测试。可以看到返回的数据格式已经转换为我们期望的数组形式:

转换后测试结果

通过这样的数据转换处理,我们成功将原始的复杂 JSON 结构简化为便于后续处理的字符串数组格式,为下一步的数据查询操作提供了便利。

4. 创建查询表数据的 API

创建 API,配置参数 authedColumns,类型为 Array<string>,SQL 查询语句如下:

SELECT name, description,
<foreach collection="authedColumns" item="column" separator=",">${column}
</foreach>
FROM products

SQL配置界面
参数配置界面

注意事项:

  • 使用 <foreach> 标签遍历 authedColumns 数组,将每个列名拼接成 SQL 语句中要查询的列名
  • 必须使用 ${column} 来动态替换列名,不能使用 #{column}

请求测试 API,可以看到 API 正常返回数据:

测试结果

5. 创建编排 API

按照以下步骤创建编排 API:

步骤 1:配置基础参数

创建编排 API,配置参数 userid,类型为 bigint

基础参数配置
参数详情

步骤 2:添加开始节点

点击添加开始节点,作为流程的起点:

开始节点

步骤 3:添加权限查询节点
  1. 点击添加 API 节点,编辑 API 节点,选择第一个 API(查询用户权限列)
  2. 配置参数 useridparameters.userid
  3. 配置节点 ID 为 getAuthedColumns

parameters 表示整个 API 的参数,parameters.userid 表示取参数 userid 的值

添加API节点
节点配置

步骤 4:添加数据查询节点
  1. 点击添加 API 节点,选择第二个 API(查询表数据)
  2. 配置参数 authedColumnsresults.getAuthedColumns
  3. 配置节点 ID 为 getData

results 表示所有 API 节点的返回结果,results.getAuthedColumns 表示取第一个 API 的返回结果

添加数据查询节点
节点参数配置

步骤 5:添加结束节点
  1. 点击添加结束节点
  2. 配置数据脚本为 results.getData.data

results 表示所有 API 节点的返回结果,results.getData.data 表示取第二个 API 的返回结果中的 data 字段的值

结束节点配置1
结束节点配置2

步骤 6:连接节点

使用连线将所有节点按顺序连接起来:开始节点 → getAuthedColumns 节点 → getData 节点 → end 节点

最后点击保存并发布编排 API:

完整流程图

预期效果

通过以上配置,不同用户将看到不同的数据列:

  • 用户 1:可以查看 costsupplier

用户1效果

  • 用户 2:只能查看 supplier

用户2效果

这种实现方式既保证了数据的安全性,又提供了灵活的权限管理机制。

总结与优化

处理空列权限的 SQL 语法问题

对于第二个 API(查询表数据的 API),当某个用户没有可访问的敏感列权限时,会生成如下 SQL 语句:

SELECT name, description, FROM products

SQL语法错误

这个 SQL 语句存在语法错误(末尾多余的逗号),会导致查询执行失败。

解决方案

DBAPI 提供了类似 MyBatis 的动态 SQL 功能,其中的 trim 标签可以优雅地解决这个问题。修改后的 SQL 如下:

SELECT
<trim prefix="" suffix="" suffixesToOverride="," prefixesToOverride="">name, description,<foreach collection="authedColumns" item="column" separator=",">${column}</foreach>
</trim>
FROM products

优化后的SQL配置

trim 标签详解

trim 标签是 DBAPI 中一个强大的动态 SQL 处理工具,其主要属性包括:

  • prefix:在包裹内容前添加指定前缀
  • suffix:在包裹内容后添加指定后缀
  • suffixesToOverride:指定需要去除的后缀字符
  • prefixesToOverride:指定需要去除的前缀字符

在这个场景中,我们将 suffixesToOverride 属性设置为逗号,,表示当 trim 标签包裹的内容以逗号结尾时,会自动去除结尾的逗号,从而避免 SQL 语法错误。

这种动态 SQL 处理机制确保了无论用户拥有多少列权限,生成的 SQL 语句都是语法正确的,大大提高了系统的健壮性和用户体验。

根据客户端身份获取权限

基于用户ID参数获取权限存在安全风险,客户端可能通过修改userid参数获取未授权的数据。更安全的做法是根据客户端身份(clientId)来确定数据访问权限。

1. 创建并配置客户端

首先创建两个客户端并授权其访问相应的API分组:

创建客户端1
授权客户端

2. 调整权限配置表结构

修改权限配置表 permission_config,使用client_id替代user_id来配置列权限:

字段名类型说明
client_idvarchar客户端 ID
table_namevarchar表名
column_namevarchar列名

示例数据:

client_idtable_namecolumn_name
CMlWBCb0v7U3goZGproductscost
CMlWBCb0v7U3goZGproductssupplier
hTAOTQ5DmEb7IXMQproductssupplier
3. 更新权限查询API

调整权限查询API配置:

  • 移除userid参数
  • 将API权限设置为私有
  • 更新SQL语句使用系统内置变量__clientId
SELECT column_name FROM permission_config 
WHERE client_id = #{__clientId} and table_name = 'products'

API SQL配置
API权限设置

提示:SQL中可直接使用系统内置变量__clientId获取当前请求的客户端ID。

4. 验证权限控制效果

使用不同客户端访问API,会得到不同的数据列权限:

客户端1访问结果
客户端2访问结果

注意:访问私有API必须携带有效的token,系统通过token识别客户端身份。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92683.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92683.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92683.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维图像处理(完整版)

目录 1.变换矩阵 2.在矩阵的基础上添加各种变换形式 3.开始变换 4.计算变换矩阵参数 新算子 二、阈值分割 新算子 三、blob分析案例 1.焊点 2.石头 3.木材 4.车牌 5.骰子 新算子 四、傅里叶变换频域分析 问题一 五、滤波处理 1.均值滤波 2.中值滤波 3.高斯…

计算机网络:求地址块128.14.35.7/20中的相关信息

128.14.35.7/20是某一地址块&#xff0c;求该地址块中的网络地址&#xff0c;IP地址最大值&#xff0c;最小值&#xff0c;地址数 这里的最大值&#xff1a;广播地址&#xff0c;最小值&#xff1a;网络地址&#xff0c;地址数&#xff1a;可分配主机数 最关键的一步就点分十进…

3深度学习Pytorch-神经网络--全连接神经网络、数据准备(构建数据类Dataset、TensorDataset 和数据加载器DataLoader)

文章目录一、深度学习概述二、神经网络基础人工神经网络&#xff08;ANN&#xff09;基本结构神经网络的构建全连接神经网络&#xff08;FCN&#xff09;计算步骤基本组件1. 线性层组件2. 激活函数&#xff08;Activation Function&#xff09;3. 损失函数&#xff08;Loss Fun…

MyEclipse启动OutOfMemoryError内存溢出

java.lang.OutOfMemoryError&#xff1a;Java heap space打开setting&#xff0c;搜索heap&#xff0c;compiler heap sizejava.lang.OutOfMemoryError&#xff1a;insufficient memory①点击file&#xff0c;选择Invalidate Caches ②点击file->Build,Excetion,Deployment-…

java毕业设计实例-基于springboot的校园资讯分享平台的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

手写 Spring

01 - 原始版本的 IOC 容器 IOC 容器的作用是自动创建对象&#xff0c;降低系统间的耦合度 core public interface Resource extends Iterator<Object>{ }外部的配置信息都当成 Resource (资源)来进行抽象 public class ClassPathXmlResource implements Resource {Docume…

【物联网】基于树莓派的物联网开发【24】——树莓派安装influxDB时序数据库

使用背景 聚焦大数据底层技术软件研发&#xff0c;实现时序数据采集、写入、存储、查询、分析 场景介绍 用于存储和分析时间序列数据的开源数据库 安装 InfluxDB 添加 InfluxDB 的仓库&#xff1a; wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - …

Python 程序设计讲义(68):Python 的文件操作——使用os模块操作文件

Python 程序设计讲义&#xff08;68&#xff09;&#xff1a;Python 的文件操作——使用os模块操作文件 目录Python 程序设计讲义&#xff08;68&#xff09;&#xff1a;Python 的文件操作——使用os模块操作文件一、删除文件&#xff1a;使用os.remove()函数二、重命名文件与…

uni-app 网络请求终极选型:uni.request、axios、uni-network、alova 谁才是你的真命请求库?

还在 uni-app 里手写 uni.request 然后自己封装到怀疑人生&#xff1f; 想用 axios 却担心小程序 2 MB 主包瞬间爆炸&#xff1f; 面对 alova、uni-network、axios 一脸懵&#xff0c;不知道选哪个才不踩坑&#xff1f; 这篇一次讲透 4 大主流方案优缺点、适用场景和避坑指南&a…

2G内存的服务器用宝塔安装php的fileinfo拓展时总是卡死无法安装成功的解决办法

临时加大 Swap&#xff08;4G&#xff09; fallocate -l 4G /swapfile2 chmod 600 /swapfile2 mkswap /swapfile2 swapon /swapfile2 free -h确认现在有了足够的 swap&#xff08;总内存 swap 应该达到 6G&#xff09;&#xff1a; free -h编译 fileinfo 扩展&#xff08;只用…

DAY 41 简单CNN

知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 → Batch归一化层…

Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理

摘要&#xff1a;本文整理自阿里云的高级技术专家、Apache Flink PMC 成员李麟老师在 Flink Forward Asia 2025 新加坡[1]站 —— 实时 AI 专场中的分享。将带来关于 Flink 2.1 版本中 SQL 在实时数据处理和 AI 方面进展的话题。Tips&#xff1a;点击「阅读原文」跳转阿里云实时…

运维巡检单(文档)

1 运维巡检表格 1.1 每日巡检记录单 1.2 周巡检报告 1.3 季度巡检报告 1.4 远程服务记录单 1.5 现场维护记录单 1.6 现场运维巡检服务单 1.7 服务器巡检记录 1.8 网络设备巡检记录 1.9 视频会议系统检测表 1.10 机房巡检报告 1.11 运维服务统计表 1.12 运维服务交接…

BLDC直流无刷电机工作原理

1.介绍什么是BLDC&#xff1f;BLDC&#xff08;Brushless Direct Current Motor&#xff0c;无刷直流电机&#xff09;是一种采用电子换向替代传统机械电刷和换向器的直流电机&#xff0c;兼具直流电机的调速性能和交流电机的结构优势在这之前我们先了解一般电机的分类以及直流…

Rust 实战四 | Traui2+Vue3+Rspack 开发桌面应用:通配符掩码计算器

往期回顾 Rust 实战三 | HTTP 服务开发及 Web 框架推荐Rust 实战二 | 开发简易版命令行工具 grepRust 实战一 | 用 RustRover 开发猜数字游戏Rust 安装与版本更新 代码开源地址&#xff1a;https://github.com/0604hx/rust-journey、通配符掩码计算器 学习一门编程语言&#…

大型语言与进化算法潜在研究方向与挑战

[1] WANG C, ZHAO J, JIAO L, 等. When Large Language Models Meet Evolutionary Algorithms: Potential Enhancements and Challenges[A/OL]. arXiv, 2025[2025-08-07]. http://arxiv.org/abs/2401.10510. DOI:10.48550/arXiv.2401.10510. 这篇文章《当大型语言模型遇到进化算…

计算二分类误差时的常见错误及解决方案

计算二分类误差时的常见错误及解决方案 在二分类任务中使用 error sum(y ! (y_hat > 0.5)) 计算分类错误时&#xff0c;可能遇到以下问题及解决方案&#xff1a; 1. 数据类型不匹配错误 问题&#xff1a;真实标签 y 和预测值 y_hat 的数据类型不一致&#xff08;如 y 是整数…

uniapp-vue2导航栏全局自动下拉变色

全局自动下拉变色解决方案 雀语文章地址 &#x1f4d6; 项目简介 这是一个基于 Vue.js 和 uni-app 的全局自动下拉变色解决方案&#xff0c;通过全局 mixin 实现页面滚动时导航栏的自动颜色变化效果。 ✨ 核心特性 ● &#x1f3af; 全局自动生效&#xff1a;无需在每个页面手动…

自有域名功能详解——安全可控的企业级访问方案

ZeroNews 推出自有域名穿透功能&#xff0c;支持用户将已备案域名与内网服务绑定&#xff0c;实现专业级访问控制。本文将系统解析其核心能力与操作逻辑。功能价值1. 所有权掌控使用企业自有域名而非第三方子域名&#xff0c;强化品牌一致性及管理权限。2. 安全合规强制 TLS 加…

Python驱动的无人机多光谱-点云融合技术在生态三维建模与碳储量/生物量/LULC估算中的全流程实战

随着生态学、林学、地理信息科学等多个学科对“结构—功能”一体化研究的共同推进&#xff0c;无人机多光谱与结构光摄影测量&#xff08;SfM&#xff09;技术已经从早期实验室验证阶段&#xff0c;走向区域尺度精细生态监测与资源清查的主流工具。过去十年&#xff0c;厘米级空…