如何在應用系統中實現數據權限的控制功能

在不少應用行業裏面,都對數據的權限作了特別的聲明,如對於銷售,財務的數據,它們是很是敏感的,所以要求對數據權限進行控制,對於基於集團性的應用系統而言,就更多須要控制好各自公司的數據了。如默認只能看本公司、或者本部門的數據,對於特殊的領導,可能須要跨部門的數據,所以不能硬編碼那個領導該訪問哪些數據,須要進行後臺的權限和數據權限的控制爲佳,本文主要針對這個特色,對這個數據權限的功能模塊進行探討,並以個人Winform開發框架的實際案例進行剖析,介紹實際項目中對數據權限的控制管理。數據庫

一、權限系統的控制

剛纔說到,對數據進行控制最好經過彈性的方式,在一個系統裏面或者功能模塊裏面對用戶角色或者崗位進行設置,通常權限控制默認在一個權限管理系統模塊進行設定,數據權限也應該如此。緩存

權限系統除了能夠對用戶能操做那些功能進行限定,也還能夠對其訪問那些組織機構的數據進行限定,咱們經過權限系統,把這些權限控制的數據進行保存,在應用系統模塊裏面進行整合便可,根據角色擁有的數據權限,授予用戶對其餘部門或者機構的數據進行訪問。以下面是我權限系統模塊裏面對角色權限的設置操做。框架

1)對角色功能權限進行設置ide

2)對角色數據權限進行控制ui

當對角色的數據權限進行保存後,咱們就能夠把這個角色可以訪問的組織機構(公司、部門、工做組等等)進行記錄起來了。this

2)應用系統的集成,實現數據權限的控制

 如個人一個病人資料應用系統,客戶要求就是基於互聯網的應用系統,所以使用WCF數據通信模式實現數據的集中管理,並且他們要基於醫院單位的數據管理模式,也就是每一個單位管理各自的數據,咱們能夠把不一樣的醫院單位做爲不一樣的公司性質來區分,這樣在權限模塊中進行設置便可。編碼

1)在應用程序中,經過在程序頭部,讓能夠管理多個醫院機構的用戶選擇管理的數據訪問,便可實現不一樣的數據區分管理。spa

2)當用戶在上面切換不一樣的機構,全部存在的界面數據所有實現刷新,如打開了不少界面,那麼這些界面的數據也隨之更新爲對應新的機構下的數據。code

瞭解了上面大體的需求,咱們應該如何經過整合權限管理系統實如今應用系統的數據權限控制和集成呢?orm

首先咱們須要在用戶登錄的時候,獲取對應用戶的數據權限內容,而後把它轉化爲咱們須要的信息,以下代碼所示。

                    //判斷若是用戶管理的公司數據多於兩個,那麼就顯示選擇單位列表,並綁定公司數據
                    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;

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

其中CallerFactory方式調用,是以WCF的方式獲取對應的數據庫數據。在上面代碼裏面,有一個RoleDataInfo的實體類,這個就是用來承載用戶角色的數據權限數據,其中包括了

BelongCompanys(所屬公司)和 BelongDepts(所屬部門 )的屬性,咱們把它解析爲我須要的數據List<int> companyList 、 SelectedCompanyID 和 DataFilterCondition,固然若是有部門的控制,能夠作的更多,我這裏僅僅以醫院機構進行區分便可。

SelectedCompanyID 就是用戶選擇查看的組織機構ID,DataFilterCondition就是用來構建一個數據過濾腳本,對用戶看到的數據進行一個過濾篩選做用。咱們把這兩個數據內容,放到Winform的緩存裏面,若是是Web能夠用Session代替,這樣能夠在多個模塊或者界面中方便訪問使用。

爲了實現用戶選擇不一樣的機構,全部打開的窗體數據實現相應的更新,那麼咱們須要處理公司選擇的操做,具體實現代碼以下所示。

        private void txtCompany_EditValueChanged(object sender, EventArgs e)
        {
            //若是用戶選擇公司,以選擇爲主,不然以當前客戶所在公司
            if (this.txtCompany.EditValue != null)
            {
                CListItem item = this.txtCompany.EditValue as CListItem;
                if (item != null)
                {
                    //設置選定的公司ID
                    Cache.Instance["SelectedCompanyID"] = item.Value;
                    SetSelectedCompanyName();

                    //設置過濾條件給界面基類使用
                    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("您已經切換數據顯示:{0}", item.Text);
                    MessageDxUtil.ShowTips(message);
                }
            }                       
        }

上面是對全部打開的窗體,傳遞了對應的信息,而後進行了刷新。那麼咱們在看看窗體自己內部的數據顯示邏輯是如何的。

咱們以病人資料的查詢界面爲例,根據不一樣的輸入條件,對數據進行不一樣查詢外,還增長了一個對組織機構過濾的條件,以下所示。

        /// <summary>
        /// 根據查詢條件構造查詢語句
        /// </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>
        /// 綁定列表數據
        /// </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();//字段列顯示名稱轉義

            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 = "病人基本資料信息報表";
        }

以上綁定代碼實現了:分頁、條件查詢、高級查詢、字段列表顯示、中文名稱轉義,以及最重要的,根據公司條件進行數據過濾的操做,從而讓用戶只能管理本身的數據。

以上就是結合權限管理系統模塊,在應用系統中實現功能權限控制和數據權限的控制的操做例子和代碼展現,但願對你們有幫助。

相關文章
相關標籤/搜索