信息系统开发平台OpenExpressApp - 数据权限
功能權(quán)限一般放在一般是放在MVC的controller層,在《信息系統(tǒng)開發(fā)平臺OpenExpressApp - 功能權(quán)限》介紹了OEA基本的功能權(quán)限,我們是通過統(tǒng)一配置的。作為數(shù)據(jù)應(yīng)用產(chǎn)品來說,數(shù)據(jù)權(quán)限也使很重要的一塊,而數(shù)據(jù)權(quán)限一般放在業(yè)務(wù)層,但我們也希望能夠通過把權(quán)限設(shè)定依據(jù)放在統(tǒng)一地方由外部來配置數(shù)據(jù)權(quán)限。本篇將介紹一下目前OpenExpressApp對數(shù)據(jù)權(quán)限的支持。
需求
數(shù)據(jù)權(quán)限總的目的:限制某些Role訪問某些數(shù)據(jù)行,比如限制客戶經(jīng)理Role只能訪問區(qū)域是北京的客戶資料,區(qū)域是上海的客戶資料,該Role就不能訪問。
一般場景:
?? 由于目前OEA對組織結(jié)構(gòu)只是簡單的支持,所以還不支持上下級等組織關(guān)系引起的數(shù)據(jù)權(quán)限,而先只考慮業(yè)務(wù)層面帶來的數(shù)據(jù)權(quán)限,如上面的2、3
?
下圖為項目中一個具體案例,以下一個項目信息圖,Project為項目,ProjectPBS為項目的一個計量維度,它關(guān)聯(lián)到PBS。ProjectPBS下有一些屬性值(ProjectPBSPropertyValue),每個屬性值關(guān)聯(lián)到之前定義的屬性(PBSProperty)。
以下為系統(tǒng)的一個查詢界面,它左邊導(dǎo)航查詢面板中用到了項目信息?,F(xiàn)在需要控制,下面第二張圖中的項目下拉數(shù)據(jù)需要考慮權(quán)限,選擇項目后PBS顯示也需要考慮權(quán)限,也就是說獲取的列表數(shù)據(jù)必須根據(jù)權(quán)限過濾過。
??
數(shù)據(jù)權(quán)限功能
根據(jù)需求,目前只支持對象集合的數(shù)據(jù)權(quán)限過濾,數(shù)據(jù)權(quán)限可能出現(xiàn)以下幾個場景:
- 對象級別
- 屬性級別
- 權(quán)限控制類型
- 可讀
- 可寫
- 自定義
目前只支持對象級別,OEA的對象級別的權(quán)限是通過控制列表的形式來體現(xiàn),目前支持前三種,只考慮對象本身設(shè)置的數(shù)據(jù)權(quán)限,權(quán)限控制類型暫考慮可讀
實現(xiàn)思路
目前實現(xiàn)數(shù)據(jù)權(quán)限基本上有以下方法:
OEA主要考慮通過表達(dá)式來設(shè)置對象列表數(shù)據(jù)權(quán)限范圍,一般的數(shù)據(jù)權(quán)限設(shè)定可以通過內(nèi)置的表達(dá)式來設(shè)置,對于復(fù)雜的,和業(yè)務(wù)相關(guān)的,可以通過外部擴(kuò)充表達(dá)式函數(shù),由表達(dá)式引擎來解析,這樣就可以處理復(fù)雜性,又能做到較好的統(tǒng)一管理。
對于復(fù)雜應(yīng)用時,代碼必須能夠控制獲取的數(shù)據(jù)是按照權(quán)限還是忽略權(quán)限,所以必須支持代碼級別上的權(quán)限控制,也就是說需要寫代碼來控制,對于通用方法,可以通過代碼生成器來生成。
數(shù)據(jù)權(quán)限配置
配置
由于數(shù)據(jù)權(quán)限設(shè)定后,需要在代碼中進(jìn)行相應(yīng)修改,添加數(shù)據(jù)檢查步驟,所以配置模塊需要知道系統(tǒng)哪些對象運(yùn)行設(shè)定數(shù)據(jù)權(quán)限。通過給業(yè)務(wù)對象的則DefaultObject增加InDataPermission屬性來標(biāo)識對象支持?jǐn)?shù)據(jù)權(quán)限功能。
[DefaultObject("5D22DEBC-6EA7-45CD-8245-3D9855AE02A6", Catalog = "指標(biāo)管理",InDataPermission=true), Label("項目信息")]
public partial class Project : GBusinessBase<Project>?
代碼修改
修改前
private void DataPortal_Fetch(){
IsReadOnly = false;
RaiseListChangedEvents = false;
using (var db = Helper.CreateDb())
{
IQuery q = db.Query();
var list = db.Select<Project>(q);
foreach (var item in list)
{
this.Add(Project.GetLazy(item.Id));
}
}
RaiseListChangedEvents = true;
}
修改后:增加檢查數(shù)據(jù)權(quán)限設(shè)定表達(dá)式步驟,這部分代碼以后也可以通過代碼生成器來生成
[DataPermission]private void DataPortal_Fetch()
{
IsReadOnly = false;
RaiseListChangedEvents = false;
using (var db = Helper.CreateDb())
{
IQuery q = db.Query();
var list = db.Select<Project>(q);
if (list.Count == 0) return;
//考慮數(shù)據(jù)權(quán)限時,添加列表前需要執(zhí)行數(shù)據(jù)權(quán)限表達(dá)式
DataPermissionExprParser oe = new DataPermissionExprParser(list[0]);
foreach (var item in list)
{
Project obj = Project.GetLazy(item.Id);
if (oe.CanRead(obj))
this.Add(obj);
}
}
RaiseListChangedEvents = true;
}
?
注意:由于支持?jǐn)?shù)據(jù)權(quán)限的業(yè)務(wù)對象會進(jìn)行檢查數(shù)據(jù)步驟,所以對系統(tǒng)性能造成一定影響,所以不需要細(xì)粒度控制到行級別數(shù)據(jù)權(quán)限的對象就不要進(jìn)行數(shù)據(jù)權(quán)限部分的修改
DataPermissionExprParser
在代碼中只需要根據(jù)業(yè)務(wù)對象實例生成一個表達(dá)式引擎 DataPermissionExprParser,它會根據(jù)類型以及當(dāng)前用戶所在的角色來組合設(shè)定的當(dāng)前對象的數(shù)據(jù)權(quán)限表達(dá)式,
public class DataPermissionExprParser : ObjectExprParser{
string mergedExpr;
public DataPermissionExprParser(object owner)
: base(owner)
{
Guid businessObjectId = new Guid(owner.GetType().GetSingleAttribute<BusinessObjectAttribute>().Id);
string[] exprs = (Csla.ApplicationContext.User.Identity as OEAIdentity).
GetDataPermissionExpr(businessObjectId);
if (exprs.Length == 0)
mergedExpr = String.Empty;
else if (exprs.Length == 1)
mergedExpr = exprs[0];
else
{
mergedExpr = string.Join(") OR (", exprs);
mergedExpr = String.Format("({0})", mergedExpr);
}
if (String.Empty != mergedExpr)
Compile(mergedExpr);
}
public bool CanRead(object owner)
{
return String.IsNullOrEmpty(mergedExpr) || (bool)Evaluate(owner);
}
}
todo
由于目前項目中只需要應(yīng)用到上面一個場景,由于時間關(guān)系,所以不可能全部支持,以下為主要的幾個待做列表:
表達(dá)式引擎
Now, 我要為了下午清醒的工作而午休了,關(guān)于表達(dá)式引擎,大家可以參考《開源 - 輕型的表達(dá)式引擎 Flee》
?
更多內(nèi)容: 開源信息系統(tǒng)開發(fā)平臺之OpenExpressApp框架.pdf
?
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明:轉(zhuǎn)載自周金根 [ http://zhoujg.cnblogs.com/ ]
轉(zhuǎn)載于:https://www.cnblogs.com/zhoujg/archive/2010/01/19/1643900.html
總結(jié)
以上是生活随笔為你收集整理的信息系统开发平台OpenExpressApp - 数据权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 状态和工作
- 下一篇: 埃洛等级分系统【转自百度百科】