DBAPI 實現不同角色控制查看表的不同列

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;厘米級空…