日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

信息系统开发平台OpenExpressApp - 数据权限

發(fā)布時間:2025/4/16 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息系统开发平台OpenExpressApp - 数据权限 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  功能權(quán)限一般放在一般是放在MVCcontroller層,在《信息系統(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就不能訪問。

  一般場景:

  • 普通員工可以對自己建立的業(yè)務(wù)對象有權(quán)限,而上級對所有下級建立的業(yè)務(wù)對象有權(quán)限
  • 員工A對區(qū)域A的業(yè)務(wù)對象有權(quán)限,員工B對區(qū)域B的業(yè)務(wù)對象有權(quán)限
  • 領(lǐng)導(dǎo)A可以看所有銷售紀(jì)錄,而大領(lǐng)導(dǎo)只關(guān)心金額超過1000K的銷售紀(jì)錄
  • ?? 由于目前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)以下幾個場景:

    • 對象級別
  • 根據(jù)本對象的屬性來過濾:如PBS名稱,則在PBS對象設(shè)置數(shù)據(jù)權(quán)限表達(dá)式 this.Name = "建安工程"
  • 根據(jù)子對象的屬性來過濾:如項目PBS屬性值(ProjectPBSPropertyValue)的某個屬性(總建筑面積)的輸入值>10000,則在ProjectPB對象設(shè)置數(shù)據(jù)權(quán)限表達(dá)式 this.ProjectPBSPropertyValues[Name="總建筑面積"].Value>10000
  • 根據(jù)關(guān)聯(lián)對象的屬性來過濾:類似2
  • 考慮相關(guān)對象(子對象或者關(guān)聯(lián)對象本身)設(shè)置的數(shù)據(jù)權(quán)限,如項目PBS得到的PBS列表考慮PBS本身的數(shù)據(jù)權(quán)限設(shè)置
    • 屬性級別
  • 對某個屬性不能查看
  • 屬性值控制:如金額>10000時不能查看等
    • 權(quán)限控制類型
    • 可讀
    • 可寫
    • 自定義

      目前只支持對象級別,OEA的對象級別的權(quán)限是通過控制列表的形式來體現(xiàn),目前支持前三種,只考慮對象本身設(shè)置的數(shù)據(jù)權(quán)限,權(quán)限控制類型暫考慮可讀

    實現(xiàn)思路

      目前實現(xiàn)數(shù)據(jù)權(quán)限基本上有以下方法:

  • 通過動態(tài)生成SQL來解決,但這只能處理簡單的權(quán)限設(shè)定  
  • 通過對每個業(yè)務(wù)單獨(dú)設(shè)計來解決,數(shù)據(jù)庫增加相應(yīng)表,但這會帶來復(fù)雜性,不好統(tǒng)一管理
  •   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)系,所以不可能全部支持,以下為主要的幾個待做列表:

  • 支持?jǐn)?shù)據(jù)權(quán)限的其它場景(關(guān)聯(lián)對象級別、屬性級別)
  • 表達(dá)式編輯器智能提示
  • 支持自定義表達(dá)式編輯器
  • 對于數(shù)據(jù)量大并且性能要求高,并且可以通過SQL where方式來過濾的情況下,支持where表達(dá)式,構(gòu)造SQL
  • 表達(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。