在很多應(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)限的控制的操作例子和代碼展示蛉抓,希望對大家有幫助庆尘。