欄位的許可權控制,一般就是控制對應角色人員對某個業務對象的一些敏感欄位的可訪問性:包括可見、可編輯性等處理。本篇隨筆結合基於SqlSugar的開發框架進行的欄位控制管理介紹。 ...
欄位的許可權控制,一般就是控制對應角色人員對某個業務對象的一些敏感欄位的可訪問性:包括可見、可編輯性等處理。本篇隨筆結合基於SqlSugar的開發框架進行的欄位控制管理介紹。
在設計欄位許可權的時候,我們需要瞭解這些還是基於RBAC的概念,基於角色進行授權的,而且我們的欄位列表是屬於具體的業務對象列表的,這裡的業務對象是指一些我們具體的業務模塊,如客戶基礎信息、人員基礎信息、報價單等等,我們就是基於這些業務進行欄位的控制的。
1、欄位許可權表的設計和界面管理
基於SqlSugar的開發框架,對應處理的業務對象信息的,是相關的實體對象信息,我們在資料庫中設計兩個資料庫,一個用於存儲對應實體類名稱的信息,如ID,實體類全名,類路徑等主體信息;一個存儲對應角色配置的欄位列表信息,結合起來就可以實現對應角色的欄位許可權控制了,資料庫表設計信息如下所示。
兩個業務表的部分欄位信息如下所示。
系統中對於欄位許可權的設置界面如下所示。
通過列表對每個實體對象信息進行配置,如果沒有對應的實體,從程式集中選擇列出來即可加入進來。
加入對應的實體信息,我們可以根據名稱反射介面獲得對應欄位參考的中文信息,然後進行展示,用於加入控制列表。
這樣配置後,系統就記錄了相關的配置信息,我們接下來就可以利用這些配置信息,在Winform界面上進行控制項的顯示處理操作了。
2、在Winform界面上進行控制項的顯示處理操作
在界面上,我們為了綁定界面控制項和欄位的關係,需要設置一個Tag來標識,然後根據系統配置信息,自動進行欄位許可權的控制處理(隱藏、設置只讀,不限制等)
/// <summary> /// 設置控制項欄位的許可權顯示或者隱藏(預設不使用欄位許可權) /// </summary> private async void SetPermit() { #region 設置控制項和欄位的對應關係 this.txtName.Tag = "Name"; this.txtAge.Tag = "Age"; #endregion //獲取列表許可權的列表 var permitDict = await BLLFactory<IFieldPermitService>.Instance.GetColumnsPermit(typeof(CustomerInfo).FullName, LoginUserInfo.Id.ToInt32()); this.SetControlPermit(permitDict, this.layoutControl1); await Task.CompletedTask; }
設置控制項的欄位顯示方式 SetControlPermit ,代碼如下所示。
/// <summary> /// 設置控制項的可見、讀寫許可權顯示 /// </summary> /// <param name="panel">控制項對象</param> /// <param name="permitDict">欄位和許可權字典,字典值為許可權控制:0可讀寫,1只讀,2隱藏值,3不顯示</param> /// <param name="layoutControl">如果存在佈局,則使用佈局控制項,否則為空</param> public static void SetControlPermit(this Control panel, Dictionary<string, int> permitDict, LayoutControl layoutControl = null) { foreach (Control ctrl in panel.Controls) { var baseCtrl = ctrl as BaseEdit; if (baseCtrl != null) { var tag = string.Concat(baseCtrl.Tag); if (!string.IsNullOrEmpty(tag) && permitDict.ContainsKey(tag)) { var permit = permitDict[tag]; var visible = (permit == 0 || permit == 1);//2、3不可見 if (layoutControl != null) { var layoutItem = layoutControl.GetItemByControl(baseCtrl); if (layoutItem != null) { layoutItem.ToVisibility(visible); } } baseCtrl.Visible = visible; baseCtrl.ReadOnly = permit == 1; } } ctrl.SetControlPermit(permitDict, layoutControl); } }
上面代碼主要就是變數面板中的控制項,並判斷tag標簽,然後進行只讀、不可見、正常等的判斷。
在列表界面中,我們可以通過設置隱藏字元讓內容隱藏,如下界面效果所示。
如果不可見,就在界面上不顯示這個列了,而非隱藏。
同樣類似編輯控制項界面,我們在列表界面也提供了對應的方法,用於隱藏列表欄位的某些信息,如下代碼所示。
//獲取欄位顯示許可權,並設置(預設不使用欄位許可權) this.winGridViewPager1.gridView1.SetColumnsPermit(permitDict);
它的實現規則也是類似,根據配置的欄位許可權控制點信息進行處理,決定是否顯示,是否隱藏,是否正常處理。
它的permitDic也是根據配置信息讀取出來進行判斷即可。
//根據業務對象獲取對應的顯示欄位,如果沒有設置,那麼根據FieldPermit表的配置獲取欄位許可權列表 var permitDict = await BLLFactory<IFieldPermitService>.Instance.GetColumnsPermit(typeof(BlackIPInfo).FullName, Portal.gc.UserInfo.Id); var displayColumns = await BLLFactory<IBlackIPService>.Instance.GetDisplayColumns(); if (permitDict != null && permitDict.Keys.Count > 0) { //0可讀寫,1只讀,2隱藏值,3不顯示 displayColumns = string.Join(",", permitDict.Keys.Where(s => permitDict[s] < 2)); } this.winGridViewPager1.DisplayColumns = displayColumns;
下麵是具體邏輯的通用控制方法,把它作為控制項的擴展函數,我們就只需要一行代碼調用就是寫控制了
/// <summary> /// 根據參數許可權字典的值:0可讀寫,1只讀,2隱藏值,3不顯示,設置列的許可權。 /// </summary> /// <param name="gridView">GridView對象</param> /// <param name="fieNamePermitDict">欄位和許可權字典,字典值為許可權控制:0可讀寫,1只讀,2隱藏值,3不顯示</param> public static void SetColumnsPermit(this GridView gridView, Dictionary<string,int> fieNamePermitDict) { char passwordChar = '*'; foreach (GridColumn col in gridView.Columns) { var include = fieNamePermitDict.ContainsKey(col.FieldName); if (include) { int permit = fieNamePermitDict[col.FieldName]; switch (permit) { case 0://正常可見、可讀寫 col.OptionsColumn.AllowEdit = true; col.OptionsColumn.ReadOnly = false; col.AppearanceHeader.ForeColor = Color.Black; col.Visible = true; break; case 1: //只讀 col.OptionsColumn.AllowEdit = false; col.OptionsColumn.ReadOnly = true; col.AppearanceHeader.ForeColor = Color.Gray; col.Visible = true; break; case 2: //隱藏值 var edit = col.CreateTextEdit(); col.Tag = string.Concat(passwordChar);//用來在界面端進行判斷,避免設置DisplayText edit.PasswordChar = passwordChar; col.Visible = true; break; case 3: //不可見 col.Visible = false; break; } } } }
通過上面的代碼處理,我們就能實現對Winform界面中的列表,編輯窗體的控制項,進行相關的欄位許可權控制顯示了。如下是實現的界面效果。
這樣在系統後臺,就可以根據需要設置一些敏感欄位的信息隱藏或者只讀處理了。
系列文章:
《基於SqlSugar的開發框架的循序漸進介紹(1)--框架基礎類的設計和使用》
《基於SqlSugar的開發框架循序漸進介紹(2)-- 基於中間表的查詢處理》
《基於SqlSugar的開發框架循序漸進介紹(3)-- 實現代碼生成工具Database2Sharp的整合開發》
《基於SqlSugar的開發框架循序漸進介紹(4)-- 在數據訪問基類中對GUID主鍵進行自動賦值處理 》
《基於SqlSugar的開發框架循序漸進介紹(5)-- 在服務層使用介面註入方式實現IOC控制反轉》
《基於SqlSugar的開發框架循序漸進介紹(6)-- 在基類介面中註入用戶身份信息介面 》
《基於SqlSugar的開發框架循序漸進介紹(7)-- 在文件上傳模塊中採用選項模式【Options】處理常規上傳和FTP文件上傳》
《基於SqlSugar的開發框架循序漸進介紹(8)-- 在基類函數封裝實現用戶操作日誌記錄》
《基於SqlSugar的開發框架循序漸進介紹(9)-- 結合Winform控制項實現欄位的許可權控制》
專註於代碼生成工具、.Net/.NetCore 框架架構及軟體開發,以及各種Vue.js的前端技術應用。著有Winform開發框架/混合式開發框架、微信開發框架、Bootstrap開發框架、ABP開發框架、SqlSugar開發框架等框架產品。轉載請註明出處:撰寫人:伍華聰 http://www.iqidi.com