如何在應(yīng)用系統(tǒng)中實現(xiàn)數(shù)據(jù)權(quán)限的控制功能

在很多應(yīng)用行業(yè)里面,都對數(shù)據(jù)的權(quán)限做了特別的聲明焕议,如對于銷售宝磨,財務(wù)的數(shù)據(jù),它們是非常敏感的盅安,因此要求對數(shù)據(jù)權(quán)限進行控制唤锉,對于基于集團性的應(yīng)用系統(tǒng)而言,就更多需要控制好各自公司的數(shù)據(jù)了别瞭。如默認(rèn)只能看本公司窿祥、或者本部門的數(shù)據(jù),對于特殊的領(lǐng)導(dǎo)蝙寨,可能需要跨部門的數(shù)據(jù)晒衩,因此不能硬編碼那個領(lǐng)導(dǎo)該訪問哪些數(shù)據(jù),需要進行后臺的權(quán)限和數(shù)據(jù)權(quán)限的控制為佳墙歪,本文主要針對這個特點浸遗,對這個數(shù)據(jù)權(quán)限的功能模塊進行探討,并以我的Winform開發(fā)框架的實際案例進行剖析箱亿,介紹實際項目中對數(shù)據(jù)權(quán)限的控制管理跛锌。

1、權(quán)限系統(tǒng)的控制

剛才說到届惋,對數(shù)據(jù)進行控制最好通過彈性的方式髓帽,在一個系統(tǒng)里面或者功能模塊里面對用戶角色或者崗位進行設(shè)置,一般權(quán)限控制默認(rèn)在一個權(quán)限管理系統(tǒng)模塊進行設(shè)定脑豹,數(shù)據(jù)權(quán)限也應(yīng)該如此郑藏。
權(quán)限系統(tǒng)除了可以對用戶能操作那些功能進行限定,也還可以對其訪問那些組織機構(gòu)的數(shù)據(jù)進行限定瘩欺,我們通過權(quán)限系統(tǒng)必盖,把這些權(quán)限控制的數(shù)據(jù)進行保存,在應(yīng)用系統(tǒng)模塊里面進行整合即可俱饿,根據(jù)角色擁有的數(shù)據(jù)權(quán)限歌粥,授予用戶對其他部門或者機構(gòu)的數(shù)據(jù)進行訪問。如下面是我權(quán)限系統(tǒng)模塊里面對角色權(quán)限的設(shè)置操作拍埠。
1)對角色功能權(quán)限進行設(shè)置



2)對角色數(shù)據(jù)權(quán)限進行控制



當(dāng)對角色的數(shù)據(jù)權(quán)限進行保存后失驶,我們就可以把這個角色能夠訪問的組織機構(gòu)(公司、部門枣购、工作組等等)進行記錄起來了嬉探。

2擦耀、應(yīng)用系統(tǒng)的集成,實現(xiàn)數(shù)據(jù)權(quán)限的控制

如我的一個病人資料應(yīng)用系統(tǒng)涩堤,客戶要求就是基于互聯(lián)網(wǎng)的應(yīng)用系統(tǒng)眷蜓,因此使用WCF數(shù)據(jù)通訊模式實現(xiàn)數(shù)據(jù)的集中管理,而且他們要基于醫(yī)院單位的數(shù)據(jù)管理模式胎围,也就是每個單位管理各自的數(shù)據(jù)账磺,我們可以把不同的醫(yī)院單位作為不同的公司性質(zhì)來區(qū)分,這樣在權(quán)限模塊中進行設(shè)置即可痊远。
1)在應(yīng)用程序中,通過在程序頭部氏捞,讓可以管理多個醫(yī)院機構(gòu)的用戶選擇管理的數(shù)據(jù)訪問碧聪,即可實現(xiàn)不同的數(shù)據(jù)區(qū)分管理。



2)當(dāng)用戶在上面切換不同的機構(gòu)液茎,所有存在的界面數(shù)據(jù)全部實現(xiàn)刷新逞姿,如打開了很多界面,那么這些界面的數(shù)據(jù)也隨之更新為對應(yīng)新的機構(gòu)下的數(shù)據(jù)捆等。
了解了上面大致的需求滞造,我們應(yīng)該如何通過整合權(quán)限管理系統(tǒng)實現(xiàn)在應(yīng)用系統(tǒng)的數(shù)據(jù)權(quán)限控制和集成呢?
首先我們需要在用戶登陸的時候栋烤,獲取對應(yīng)用戶的數(shù)據(jù)權(quán)限內(nèi)容谒养,然后把它轉(zhuǎn)化為我們需要的信息,如下代碼所示明郭。

//判斷如果用戶管理的公司數(shù)據(jù)多于兩個买窟,那么就顯示選擇單位列表,并綁定公司數(shù)據(jù)
List<RoleDataInfo> roleDataList = CallerFactory<IRoleDataService>.Instance.FindByUser(info.ID);
List<int> companyList = new List<int>();
foreach (RoleDataInfo roleDataInfo in roleDataList)
{
    if (!string.IsNullOrEmpty(roleDataInfo.BelongCompanys))
    {
        string[] companyArray = roleDataInfo.BelongCompanys.Split(',');
        foreach (string company in companyArray)
        {
            if (!string.IsNullOrEmpty(company) && ValidateUtil.IsNumber(company.Trim()))
            {
                if (!companyList.Contains(company.ToInt32()))
                {
                    companyList.Add(company.ToInt32());
                }
            }
        }
    }
}
Portal.gc.CompanyList = companyList;

//設(shè)置選定的公司ID
Cache.Instance["SelectedCompanyID"] = info.Company_ID;
//設(shè)置過濾條件給界面基類使用
Cache.Instance["DataFilterCondition"] = string.Format(" (Company_ID is null OR Company_ID = '{0}')", info.Company_ID);

其中CallerFactory方式調(diào)用薯定,是以WCF的方式獲取對應(yīng)的數(shù)據(jù)庫數(shù)據(jù)始绍。在上面代碼里面,有一個RoleDataInfo的實體類话侄,這個就是用來承載用戶角色的數(shù)據(jù)權(quán)限數(shù)據(jù)亏推,其中包括了

BelongCompanys(所屬公司)和 BelongDepts(所屬部門 )的屬性,我們把它解析為我需要的數(shù)據(jù)List<int> companyList 年堆、 SelectedCompanyID 和 DataFilterCondition吞杭,當(dāng)然如果有部門的控制,可以做的更多变丧,我這里僅僅以醫(yī)院機構(gòu)進行區(qū)分即可篇亭。

SelectedCompanyID 就是用戶選擇查看的組織機構(gòu)ID,DataFilterCondition就是用來構(gòu)建一個數(shù)據(jù)過濾腳本锄贷,對用戶看到的數(shù)據(jù)進行一個過濾篩選作用译蒂。我們把這兩個數(shù)據(jù)內(nèi)容曼月,放到Winform的緩存里面,如果是Web可以用Session代替柔昼,這樣可以在多個模塊或者界面中方便訪問使用哑芹。

為了實現(xiàn)用戶選擇不同的機構(gòu),所有打開的窗體數(shù)據(jù)實現(xiàn)相應(yīng)的更新捕透,那么我們需要處理公司選擇的操作聪姿,具體實現(xiàn)代碼如下所示。

private void txtCompany_EditValueChanged(object sender, EventArgs e)
{
    //如果用戶選擇公司乙嘀,以選擇為主末购,否則以當(dāng)前客戶所在公司
    if (this.txtCompany.EditValue != null)
    {
        CListItem item = this.txtCompany.EditValue as CListItem;
        if (item != null)
        {
            //設(shè)置選定的公司ID
            Cache.Instance["SelectedCompanyID"] = item.Value;
            SetSelectedCompanyName();

            //設(shè)置過濾條件給界面基類使用
            string condition = string.Format(" Company_ID = '{0}'", item.Value);
            Cache.Instance["DataFilterCondition"] = condition;
            
            //遍歷全部窗口,更新
            foreach (WHC.Framework.BaseUI.BaseDock form in this.MdiChildren)
            {
                form.SelectedCompanyID = item.Value;
                form.DataFilterCondition = condition;
                form.FormOnLoad();
            } 

            string message = string.Format("您已經(jīng)切換數(shù)據(jù)顯示:{0}", item.Text);
            MessageDxUtil.ShowTips(message);
        }
    }                       
}

上面是對所有打開的窗體虎谢,傳遞了對應(yīng)的信息盟榴,然后進行了刷新。那么我們在看看窗體本身內(nèi)部的數(shù)據(jù)顯示邏輯是如何的婴噩。

我們以病人資料的查詢界面為例擎场,根據(jù)不同的輸入條件,對數(shù)據(jù)進行不同查詢外几莽,還增加了一個對組織機構(gòu)過濾的條件迅办,如下所示。

/// <summary>
/// 根據(jù)查詢條件構(gòu)造查詢語句
/// </summary> 
private string GetConditionSql()
{
    //如果存在高級查詢對象信息章蚣,則使用高級查詢條件站欺,否則使用主表條件查詢
    SearchCondition condition = advanceCondition;
    if (condition == null)
    {
        condition = new SearchCondition();
        condition.AddCondition("BedNo", this.txtBedNo.Text.Trim(), SqlOperator.Like);
        condition.AddCondition("TumorPart", this.txtTumorPart.Text.Trim(), SqlOperator.Like);
        ........................
        condition.AddDateCondition("InDate", this.txtInDate, this.txtInDateEnd);
        condition.AddDateCondition("LeaveDate", this.txtLeaveDate, this.txtLeaveDateEnd);if (this.chkHasReferral.Checked)
        {
            condition.AddCondition("HasReferral", "是", SqlOperator.Equal, true);
        }
        ...................
    }

    string where = condition.BuildConditionSql().Replace("Where", "");
    
    //如果公司過濾條件不為空,那么需要進行過濾
    if (!string.IsNullOrEmpty(this.DataFilterCondition))
    {
        where += string.Format(" AND {0}", this.DataFilterCondition);
    }

    return where;
}

/// <summary>
/// 綁定列表數(shù)據(jù)
/// </summary>
private void BindData()
{
    //entity
    this.winGridViewPager1.DisplayColumns = "HandNo,BedNo,MidVideo,Name,Sex,IdentityCard,Age,Birthday,HospitalNo,IDNumber,InDate,InDiagnosis,SurgeryDate,DirectorSurgeon,LeaveDate,TumorPart,LeaveDiagnosis,IsFirstTime,LeaveSpecimens,OuterFilm,PreMRI,PreCT,PrePicture,MidPathology,AfterCTMRI,AfterPicture,AfterVideo,LeavePicture,Endocrine,Professor,Address,Telephone,HasReferral,ReferralDate,ReferralTime,Pathology,Note,Report";
    this.winGridViewPager1.ColumnNameAlias = CallerFactory<IPatientService>.Instance.GetColumnNameAlias();//字段列顯示名稱轉(zhuǎn)義

    string where = GetConditionSql();
    PagerInfo pagerInfo = this.winGridViewPager1.PagerInfo;
    List<PatientInfo> list = CallerFactory<IPatientService>.Instance.FindWithPager(where, ref pagerInfo);
    this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<PatientInfo>(list);
    this.winGridViewPager1.PrintTitle = "病人基本資料信息報表";
}

以上綁定代碼實現(xiàn)了:分頁纤垂、條件查詢镊绪、高級查詢、字段列表顯示洒忧、中文名稱轉(zhuǎn)義蝴韭,以及最重要的,根據(jù)公司條件進行數(shù)據(jù)過濾的操作熙侍,從而讓用戶只能管理自己的數(shù)據(jù)榄鉴。

以上就是結(jié)合權(quán)限管理系統(tǒng)模塊,在應(yīng)用系統(tǒng)中實現(xiàn)功能權(quán)限控制和數(shù)據(jù)權(quán)限的控制的操作例子和代碼展示蛉抓,希望對大家有幫助庆尘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巷送,隨后出現(xiàn)的幾起案子驶忌,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件付魔,死亡現(xiàn)場離奇詭異聊品,居然都是意外死亡,警方通過查閱死者的電腦和手機几苍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門翻屈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妻坝,你說我怎么就攤上這事伸眶。” “怎么了刽宪?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵厘贼,是天一觀的道長。 經(jīng)常有香客問我圣拄,道長嘴秸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任售担,我火速辦了婚禮,結(jié)果婚禮上署辉,老公的妹妹穿的比我還像新娘族铆。我一直安慰自己,他們只是感情好哭尝,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布哥攘。 她就那樣靜靜地躺著,像睡著了一般材鹦。 火紅的嫁衣襯著肌膚如雪逝淹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天桶唐,我揣著相機與錄音栅葡,去河邊找鬼。 笑死尤泽,一個胖子當(dāng)著我的面吹牛欣簇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坯约,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熊咽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闹丐?” 一聲冷哼從身側(cè)響起横殴,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卿拴,沒想到半個月后衫仑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梨与,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年惑畴,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛋欣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡如贷,死狀恐怖陷虎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杠袱,我是刑警寧澤尚猿,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站楣富,受9級特大地震影響凿掂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纹蝴,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一庄萎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塘安,春花似錦糠涛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至切黔,卻和暖如春砸脊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纬霞。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工凌埂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人诗芜。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓侨舆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绢陌。 傳聞我的和親對象是個殘疾皇子挨下,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容