權限即數據:企業系統中的字段級訪問控制架構實戰(β=0.6)

摘要

這篇文章介紹了一個企業系統中的字段權限解析方案,通過規則表與命中記錄表(biz_rule_hit)聯動,實現對業務數據的動態權限控制。流程包括替換用戶上下文變量、記錄命中規則、查詢業務數據并關聯命中信息,最終在內存中合并字段權限等級(editable/view/masked/hidden),返回前端使用。該方案支持多規則疊加、權限優先級合并,并實現前后端解耦,適用于復雜權限場景的可審計、可擴展設計。
規則表 + biz_rule_hit → JOIN 業務表 → 內存生成字段權限 → 返回前端,并且處理四種權限(editable/view/masked/hidden)逗號分割字段

下面用 Java + 數據庫 的完整示例:


1?? 數據庫:統一規則命中表

CREATE TABLE biz_rule_hit (biz_table_name VARCHAR(128) NOT NULL,  -- 業務表名biz_id INT NOT NULL,                   -- 業務表主鍵rule_id INT NOT NULL,                  -- 命中規則IDuser_id INT NOT NULL,                  -- 用戶IDhit_time DATETIME DEFAULT GETDATE(),PRIMARY KEY (biz_table_name, biz_id, rule_id, user_id)
);
  • 一張表管理所有業務表的命中記錄
  • biz_table_name 區分業務表

2?? 讀取規則表(替換用戶上下文變量 + 解析字段)

class Rule {int ruleId;String evaluatedCondition;      // 替換后的 SQL 條件List<String> editable;List<String> view;List<String> masked;List<String> hidden;
}int userId = 123;
int deptId = 10;
String bizTable = "biz_table";List<Rule> rules = jdbcTemplate.query("SELECT rule_id, condition_sql, editable, view, masked, hidden FROM rule_table WHERE biz_table = ? ORDER BY priority ASC",new Object[]{bizTable},(rs, rowNum) -> {Rule r = new Rule();r.ruleId = rs.getInt("rule_id");r.evaluatedCondition = rs.getString("condition_sql").replace("@UserID", String.valueOf(userId)).replace("@DeptID", String.valueOf(deptId));r.editable = Arrays.asList(rs.getString("editable").split(","));r.view     = Arrays.asList(rs.getString("view").split(","));r.masked   = Arrays.asList(rs.getString("masked").split(","));r.hidden   = Arrays.asList(rs.getString("hidden").split(","));return r;}
);

3?? 寫入 biz_rule_hit 命中表

// 先刪除該用戶該業務表舊記錄
jdbcTemplate.update("DELETE FROM biz_rule_hit WHERE user_id = ? AND biz_table_name = ?", userId, bizTable);// 插入命中記錄
StringBuilder sqlInsertHits = new StringBuilder();
for(Rule rule : rules){sqlInsertHits.append("INSERT INTO biz_rule_hit (biz_table_name, biz_id, rule_id, user_id) ").append("SELECT '").append(bizTable).append("', b.id, ").append(rule.ruleId).append(", ").append(userId).append(" FROM ").append(bizTable).append(" b WHERE ").append(rule.evaluatedCondition).append(";");
}
jdbcTemplate.execute(sqlInsertHits.toString());
  • 命中表存儲 業務表名 + biz_id + rule_id + user_id
  • 可以長期保存,支持審計

4?? 查詢業務表 + JOIN 命中表

String sqlQuery = "SELECT b.*, r.rule_id " +"FROM " + bizTable + " b " +"LEFT JOIN biz_rule_hit r " +"ON r.biz_id = b.id AND r.biz_table_name = ? AND r.user_id = ?";List<Map<String,Object>> bizData = jdbcTemplate.queryForList(sqlQuery, bizTable, userId);
  • rule_id 為 NULL → 沒命中規則
  • LEFT JOIN 保證業務表所有行都返回

5?? 內存生成字段權限(合并四種權限等級)

Map<String, Integer> levelMap = Map.of("hidden", 0,"masked", 1,"view", 2,"editable", 3
);Map<Integer, Map<String, String>> bizPermissions = new HashMap<>();for(Map<String,Object> row : bizData){int bizId = (Integer) row.get("id");bizPermissions.putIfAbsent(bizId, new HashMap<>());Integer ruleId = (Integer) row.get("rule_id");if(ruleId == null) continue; // 沒命中規則// 找到規則對象Rule rule = rules.stream().filter(r -> r.ruleId == ruleId).findFirst().orElse(null);if(rule == null) continue;// 更新每個字段權限updatePermission(bizPermissions.get(bizId), rule.editable, "editable", levelMap);updatePermission(bizPermissions.get(bizId), rule.view, "view", levelMap);updatePermission(bizPermissions.get(bizId), rule.masked, "masked", levelMap);updatePermission(bizPermissions.get(bizId), rule.hidden, "hidden", levelMap);
}// 工具方法
void updatePermission(Map<String,String> permMap, List<String> fields, String newLevel, Map<String,Integer> levelMap){for(String field : fields){String current = permMap.getOrDefault(field, "hidden");if(levelMap.get(newLevel) > levelMap.get(current)){permMap.put(field, newLevel);}}
}
  • editable > view > masked > hidden
  • 多條規則疊加時取最大權限

6?? 返回前端

List<Map<String,Object>> result = bizData.stream().map(row -> {int bizId = (Integer) row.get("id");row.put("permissions", bizPermissions.getOrDefault(bizId, Collections.emptyMap()));return row;}).collect(Collectors.toList());
  • 前端直接使用 permissions 控制字段顯示/編輯/脫敏
  • 完全透明,不需要解析 SQL 規則

? 總結流程

  1. 查詢規則表 → 替換用戶上下文 → 解析字段名
  2. 寫入統一 biz_rule_hit
  3. 查詢業務表 + LEFT JOIN 命中表 → 得到命中規則
  4. 內存合并字段權限(四種等級)
  5. 返回前端
  • 一張 _rule_hit 表管理所有業務表
  • 支持用戶變量、權限等級合并、多條規則疊加
  • 前端拿到 permissions 即可控制字段

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98713.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98713.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98713.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬蟲實戰:研究Specialty Plots模塊,構建空氣質量監測數據采集和分析系統

1. 引言 1.1 研究背景 隨著全球城市化進程的加速和工業的快速發展,空氣質量問題已成為影響人類健康和生態環境的重要因素。世界衛生組織數據顯示,全球超過 90% 的人口生活在空氣質量超標的環境中,空氣污染每年導致約 700 萬人過早死亡。準確、及時地獲取和分析空氣質量數據…

字典樹算法

一、什么是Trie&#xff1f; Trie&#xff08;發音為"try"&#xff09;&#xff0c;也稱為字典樹、前綴樹&#xff0c;是一種多叉樹結構&#xff0c;專門用于高效存儲和檢索字符串集合。其核心特點是共享字符串的公共前綴&#xff0c;從而大幅減少冗余存儲&#xff0…

Laya使用VideoNode動態加載視頻,可以自定義播放視頻此處以及位置

export class VideoCommand {video: Laya.VideoNode;public duration: number 0;/*** param videoPos 視頻位置* param videoSize 視頻大小*/public constructor(videoPos: Laya.Vector2, videoSize: Laya.Vector2) {this.video new Laya.VideoNode;//添加到舞臺 1是場景中的…

yum localinstall安裝本地包

yum localinstall 是一個用于安裝本地 RPM 包并自動處理依賴關系的命令。當你有一個或多個本地的 RPM 包需要安裝,又希望 yum 能幫你解決可能存在的依賴問題時,這個命令就非常有用。下面我會詳細解釋它的用法和注意事項。 ??? 命令基本用法 yum localinstall 命令的基本…

LeetCode 面試經典 150 題:輪轉數組(三次翻轉法詳解 + 多解法對比)

在數組類算法題中&#xff0c;“輪轉數組” 是一道考察 “原地操作” 與 “邏輯轉換” 能力的經典題目。所謂 “輪轉”&#xff0c;是指將數組元素向右移動指定步數&#xff0c;且超出數組長度的元素需 “循環” 到數組開頭。這道題的最優解 ——三次翻轉法&#xff0c;能以 O …

網絡編程---TCP

1.TCP&#xff1a;傳輸控制協議&#xff0c;位于傳輸層2.TCP的特性&#xff1a;a.使用流式套接字&#xff0c;數據連續&#xff0c;有順序b.TCP是可靠傳輸&#xff0c;有有應答機制ACK&#xff0c;即收到數據后會明確告知發送方已收到數據&#xff1b;若發送方沒有在預計時間收…

對計算機網絡模型的理解

文章目錄 目錄 前言 一、Internet 的核心特點 二、Internet 的組成結構 1. 硬件基礎&#xff1a;網絡運行的 “物理載體” 2. 軟件支撐&#xff1a;網絡運行的 “功能橋梁” 3. 協議規則&#xff1a;網絡運行的 “通用語言” 三、OSI 七層參考模型&#xff08;理論標準&…

每日一算:分發糖果

在算法面試中&#xff0c;“分發糖果” 是一道經典的貪心算法應用題&#xff0c;核心考察對 “局部最優推導全局最優” 的理解。本文將從問題分析出發&#xff0c;提供兩種主流解題思路&#xff0c;并附上 C 實現代碼&#xff0c;幫助你徹底掌握這道題。一、問題重述題目要求有…

【WorkManager】無法在 Direct Boot 模式下初始化

【WorkManager】無法在 Direct Boot 模式下初始化一、問題描述二、問題分析2.1 關于 Direct Boot 模式2.2 支持 Direct Boot 模式2.3 手動初始化 WorkManager 組件2.4 WorkManager 不支持 Direct Boot 的官方修改三、解決方案一、問題描述 在使用 WorkManager 庫來實現開機上報…

Hybrid應用性能優化實戰分享(本文iOS 與 H5為例,安卓同理)

前言在移動應用開發中&#xff0c;Hybrid 架構因其跨平臺特性和開發效率優勢被廣泛采用。然而&#xff0c;WebView 的性能問題一直是開發者面臨的挑戰。本文將基于實際項目經驗&#xff0c;分享 iOS Hybrid 應用的核心優化策略&#xff0c;涵蓋 WebView 池化、預加載、用戶體驗…

點積、叉積、矩陣行列式詳解、線性相關與線性無關、矩陣的秩、矩陣可逆與不可逆詳解

1.向量 1.1 點積&#xff08;Dot Product&#xff09; 1.1.1 定義 點積是在求一個標量&#xff0c;點積結果沒有方向。 對于兩個向量u(u1,u2,u3),v(v1,v2,v3)\bold{u}(u_1,u_2,u_3),\bold{v}(v_1,v_2,v_3)u(u1?,u2?,u3?),v(v1?,v2?,v3?) 點積定義為&#xff1a;u?vu1v1u…

Mac安裝nvm詳細教程(超簡單)

本章教程,主要介紹如何在Mac操作系統上安裝nvm. 我們使用官方一鍵安裝腳本,完成安裝 一、安裝步驟 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash配置環境變量,編輯.zshrc文件 vim .zshrcexport NVM_DIR="$(

【selenium】網頁元素找不到?從$(‘[placeholder=“手機號“]‘)說起

網頁元素找不到&#xff1f;從$(‘[placeholder“手機號”]’)說起總結&#xff1a;控制臺不騙人&#xff0c;元素選不到&#xff0c;八成是寫法、時機或環境的問題。我們在寫網頁自動化腳本或者調試頁面的時候&#xff0c;經常遇到一個讓人頭疼的問題&#xff1a;明明元素就在…

SSE 模仿 GPT 響應

后端代碼 const express require(express) const cors require(cors);const app express(); app.use(cors()); const port 3000;app.listen(port, () > {console.log(Server running at http://localhost:${port}/); });const msg 全國同胞們&#xff0c; 尊敬的各位國…

MAC 多個版本 JDK進行切換

1.查看本機所有的jdk/usr/libexec/java_home -V2、打開bash_profile文件。可以在終端vim ~/.bash_profile打開&#xff0c;也可以打開訪達shiftcmdG然后輸入/Users/mac/.bash_profile&#xff08;本機bash_profile的路徑&#xff09;加入新的環境變量格式如下&#xff08;參考我…

shell 中 expect 詳解

一、概述Expect是一個免費的編程工具語言&#xff0c;用來實現自動和交互式任務進行通信&#xff0c;而無需人的干預。Expect的作者DonLibes在1990年開始編寫Expect時對Expect做有如下定義&#xff1a;Expect是一個用來實現自動交互功能的軟件套件。通過expect系統管理員可以創…

第4講 機器學習基礎概念

機器學習作為人工智能的子領域&#xff0c;專注于訓練計算機算法自動發現數據中的模式與關聯關系。以下是其核心基礎概念&#xff1a;4.1 數據數據是機器學習的基石。缺乏數據&#xff0c;算法將無從學習。數據可呈現為結構化數據&#xff08;如電子表格、數據庫&#xff09;和…

Go組合式繼承:靈活替代方案

Go 語言沒有傳統面向對象編程中的繼承機制&#xff0c;但通過組合和接口實現類似功能。Go 更提倡組合優于繼承的設計原則&#xff0c;這種設計方式更靈活且易于維護。結構體組合&#xff08;偽繼承&#xff09;通過嵌套結構體實現類似繼承的效果。子結構體可以直接訪問父結構體…

Verilog三段式FSM,實現十字路口紅綠燈

運行環境&#xff1a;VCS verdi狀態說明&#xff1a;S0 &#xff1a; 初始狀態 S1 &#xff1a; 東西方向綠燈亮&#xff0c;南北方向紅燈亮&#xff1b;點亮30周期 S2 &#xff1a; 東西方向黃燈亮&#xff0c;南北方向紅燈亮&#xff1b;點亮2 周期 S3 &#xff1a; 東西方向…

java 將pdf轉圖片

如何將pdf文件轉為圖片 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class Pdf2Png {/**…