1. 程式人生 > >通用資料級許可權控制解決方案的實現(一):Cube中的自定義DLL

通用資料級許可權控制解決方案的實現(一):Cube中的自定義DLL

BI資料分析是目前企業的熱門應用,而對企業來說,進行許可權控制必須而且非常重要的,尤其是作為決策用的企業報表。在BI解決方案中,許可權控制又分為2種:一種是報表級許可權控制,這型別許可權控制沒有什麼好講的,報表系統都本身就支援了。另一種比較複雜的就是資料級許可權控制,所謂的資料級許可權控制,就是使用者只能看自己許可權範圍內的資料以及這些資料的統計結果。比如一個大型公司的華南區銷售主管就不能看到華北區的銷售資料和統計結果;雖然華南區主管和華北區主管都是瀏覽同一張銷售報表,但是該報表上出來的資料結果卻不一樣。

在這個系列裡,我將講述下基於微軟的SSAS來實現通用的資料級許可權控制解決方案。而SSRS不會在本文中涉及,因為SSRS是進行報表級許可權控制的,與資料級許可權的控制並沒有

關係。其實有資料級許可權控制支援的報表,其報表級許可權控制甚至都可以不需要,因為沒有許可權的使用者看到的只是一片資料上的空白;當然了,從實際角度出發,還是需要做好報表級許可權控制的。

基於SQL Server的BI解決方案中,資料級許可權的控制會涉及如下內容

  1. 在SSAS的Cube中設定需要對哪些維度進行資料級許可權控制
  2. 提供給使用者一個介面友好的控制檯,讓使用者能夠非常方便的做資料級許可權控制的配置。

為了更好的講述資料級許可權控制的效果,我們以一個例項來說明。在我們的Cube中有一個維度是"區域-城市-辦公室",我們主要是控制該維度的資料級許可權。區域分為:華南區、華北區、華東區、西南區、東北區;在效果上主要看對區域進行資料許可權控制下的報表結果。

明白了我們的任務,首先開始的是如何在SSAS的Cube中作設定,讓其支援我們的資料級許可權控制。這個設定分為2部分:

  1. 通過SSAS的自定義DLL來讀取使用者的許可權設定,如果是我們的示例,就是讀取使用者是哪個區域的。
  2. 建立一個新的角色,設定該角色的維度資料的自定義允許的結果集。

第一步是開發一個.NET 類庫,並且把這個類庫部署到SSAS中,準備提供給第二步的設定中使用。其實這個類庫的程式碼比較簡單,一般都不會超過50行。我們來看看程式碼和簡單的說明:

Code

publicclass DataSecurity
    {
        
// 返回使用者有許可權檢視到的資料集字串, 類似return "{[Location].[City].&[Seattle]}";
        

// domain_account:瀏覽報表的使用者域帳號
         
// dimension:要查詢的維度,實際為維度的Attributepublicstaticstring GetDimensionSet(string domain_account, string dimension, string unique_name)
        {
            String connection_string 
=string.Empty;

            
// BI.DataSecurity.Settings.txt 中儲存了一個數據庫連線字串,該資料庫記錄了使用者的具體許可權配置。using (StreamReader sr =new StreamReader("C:\\BI.DataSecurity.Settings.txt"))
            {
                connection_string 
= sr.ReadLine();
            }

            SqlConnection connection 
=new SqlConnection(connection_string);

            connection.Open();

            SqlCommand command 
=new SqlCommand("GetDimensionSet", connection);

            command.CommandType 
= System.Data.CommandType.StoredProcedure;

            SqlParameter p1 
=new SqlParameter("@domain_account", domain_account);
            SqlParameter p2 
=new SqlParameter("@dimension", dimension);

            command.Parameters.Add(p1);
            command.Parameters.Add(p2);

            SqlDataReader reader 
= command.ExecuteReader();

            
string result_set =string.Empty;

            
int count =0;

            
while (reader.Read())
            {
                count
++;

                
if (result_set !=string.Empty) result_set +=",";

                result_set 
+= (string)reader["DimensionSet"];
            }

            command.Dispose();

            connection.Close();

            connection.Dispose();

            
if (count ==0)
            {
                
return"{"+ unique_name +"}";
            }

            
return"{"+ result_set +"}";
        }

        
public DataSecurity()
        {
        }
    }

我們把這個生成的DLL命名為:BIDataSecurity.dll

接下來,就需要將這個DLL放到SSAS中以供後面的維度資料中的設定呼叫。

開啟SSAS,點選如下圖所示的"New Assembly...",然後在開啟的視窗中,把上面的這個BIDataSecurity.dll傳到SSAS中。

完成以後,我們就完成了第一步,設定好了Cube的自定義DLL,第二步中將呼叫這個介面獲取使用者的授權資料。