用戶權限設計 ASP.NET系統用戶權限設計與實現、用戶認證管理設計方案、通用數據權限管理系統設計

http://www.cnblogs.com/freetalent/archive/2008/11/18/1335681.html

引言

    電子商務系統對安全問題有較高的要求,傳統的訪問控制方法DAC(Discretionary Access Control,自主訪問控制模型)、MAC(Mandatory Access Control,強制訪問控制模型)難以滿足複雜的企業環境需求。因此,NIST(National Institute of Standards and Technology,美國國家標準化和技術委員會)於90年代初提出了基於角色的訪問控制方法,實現了用戶與訪問權限的邏輯分離,更符合企業的用戶、組織、數據和應用特徵。ASP.NET是微軟爲了抗衡JSP而推出的新一代ASP(Active Server Pages)腳本語言,它借鑑了JSP的優點,同時它又具有自身的一些新特點。

    本文將首先介紹ASP.NET的基本情況和RBAC(Role Based Access Control)的基本思想,在此基礎上,給出電子商務系統中實現用戶權限控制的一種具體方法。

    ASP.NET概述

    1、ASP.NET

    ASP.NET是微軟流行的動態WEB編程技術活動服務器網頁(ASP)的最新版本,但它遠不是傳統ASP簡單升級。ASP.NET和ASP的最大區別在於編程思維的轉換,ASP.NET是真正的面向對象(Object-oriented),而不僅僅在於功能的增強。

    在ASP.NET中,Web 窗體頁由兩部分組成:視覺元素(HTML、服務器控件和靜態文本)和該頁的編程邏輯。其中每一部分都存儲在一個單獨的文件中。可視元素在一個擴展名爲 .aspx 文件中創建,而代碼位於一個單獨的類文件中,該文件稱作代碼隱藏類文件擴展名爲.aspx.vb 或 .aspx.cs。這樣,.aspx文件中存放所有要顯示的元素,aspx.vb或.aspx.cs文件中存放邏輯。

    2、用戶控件(UserControl)

    爲了使用戶能夠根據需要方便地定義控件,ASP.NET引入了 Web 窗體用戶控件的概念。實際上,只要將.aspx稍作修改即可轉換爲 Web 用戶控件,擴展名爲 .ascx,.ascx和.aspx文件一樣也有一個存放邏輯的代碼隱藏類文件,擴展名爲.ascx.vb或.ascx.cs,只是它不能作爲獨立 Web 窗體頁來運行,只有當被包含在 .aspx文件中時,用戶控件才能工作。

    通過以下兩個步驟在WEB窗體頁中設置用戶控件:

    (1)使用@ Register指令在.aspx文件中註冊用戶控件。如要註冊在放在相對路徑“../UserControl/”下的頭文件headinner.ascx的方法爲:

<%@ Register TagPrefix="Acme" TagName="Head" Src="../UserControl/headinner.ascx" %>

    (2)在服務器控件的開始標記和結束標記之間(<form runat=server> </form>) 聲明該用戶控件元素。例如要聲明上面所導入的控件的語法爲:

<Acme: Head runat="server"/>

    這樣,該控件就成爲頁的一部分,並將在處理該頁時呈現出來。並且,該控件的公共屬性、事件和方法將向 Web 窗體頁公開並且可以通過編程來使用。根據這個原理,就可以將每個頁面初始化時所要執行的操作(如登錄驗證,角色驗證)封裝在用戶控件當中。
RBAC的基本思想

RBAC(角色訪問控制)的基本思想可簡單地用圖1來表示,即把整個訪問控制過程分成兩步:訪問權限與角色相關聯,角色再與用戶關聯,從而實現了用戶與訪問權限的邏輯分離。

    由於RBAC實現了用戶與訪問權限的邏輯分離,因此它極大的方便了權限管理。例如,如果一個用戶的職位發生變化,只要將用戶當前的角色去掉,加入代表新職務或新任務的角色即可,角色/權限之間的變化比角色/用戶關係之間的變化相對要慢得多,並且委派用戶到角色不需要很多技術,可以由行政管理人員來執行,而配置權限到角色的工作比較複雜,需要一定的技術,可以由專門的技術人員來承擔,但是不給他們委派用戶的權限,這與現實中情況正好一致。

    用戶權限在.NET中的設計與實現

    利用.NET中的用戶控件實現權限控制的基本思想是:根據角色訪問控制(RBAC)的基本原理,給用戶分配一個角色,每個角色對應一些權限,然後利用ASP.NET中的用戶控件(UserControl)來判斷該用戶對應的角色是否對訪問頁面有訪問的權力。

    下面將從數據庫設計、添加角色和用戶控件的使用等三方面來闡述具體實現過程。

1、數據庫中表的設計

    首先,在數據庫中設計功能模塊表、功能表和角色表等三個表。

    (1) 功能模塊表

    爲了管理好用戶的權限,首先要組織好系統的模塊,爲此設計了一個功能模塊表。見表1。

    (2) 功能表

    每個功能模塊所具有的子功能稱爲功能,如商品管理模塊goods(屬於功能模塊的範疇)包含商品信息查詢、商品信息更新、商品信息刪除、商品定價信息查詢以及商品定價信息更新五種功能,功能表的設計見表2。

    上面提到的例子可以作爲這樣幾條記錄分別插入功能模塊表和功能表。

 

insert into TModule values(0,///////////////////////////////////////////////////////////////'商品管理模塊///////////////////////////////////////////////////////////////',///////////////////////////////////////////////////////////////'goods///////////////////////////////////////////////////////////////',5);
insert into Tfunction values(0,///////////////////////////////////////////////////////////////'商品信息查詢///////////////////////////////////////////////////////////////',///////////////////////////////////////////////////////////////'selectgoods///////////////////////////////////////////////////////////////',0);
insert into Tfunction values(1,///////////////////////////////////////////////////////////////'商品信息更新///////////////////////////////////////////////////////////////',///////////////////////////////////////////////////////////////'updategoods///////////////////////////////////////////////////////////////',0);
insert into Tfunction values(2,///////////////////////////////////////////////////////////////'商品信息刪除///////////////////////////////////////////////////////////////',///////////////////////////////////////////////////////////////'deletegoods///////////////////////////////////////////////////////////////',0);
insert into Tfunction values(3,///////////////////////////////////////////////////////////////'商品定價信息查詢///////////////////////////////////////////////////////////////',///////////////////////////////////////////////////////////////'selectgoodsprice///////////////////////////////////////////////////////////////',0);
insert into Tfunction values(4,///////////////////////////////////////////////////////////////'商品定價信息更新///////////////////////////////////////////////////////////////',///////////////////////////////////////////////////////////////'updategoodsprice///////////////////////////////////////////////////////////////',0);

    (3) 角色表

    角色表的設計關鍵在於角色值的定義,它是一個由0和1組成的類似二進制數的字符串。而功能表中的funcNo (功能編號)字段表示該功能在角色表的roleValue (角色值)字段中的位置,如果該位置對應的數值是0,表示該角色無此權限,如果值爲1,則表示該角色擁有此權限。如角色普通會員的角色值爲100100…00(共100位),如上所示,商品信息查詢的功能編號爲0,角色值100100…00的第0位爲1,所以該普通會員角色擁有商品信息查詢的功能;相反,該角色值的第1位爲0,而功能編號爲1 的功能爲商品信息更新,所以該普通會員角色沒有商品信息更新的權限。它們的關係可由圖2來表示。

2、角色的添加

    有了上面幾個表,角色頁面的功能模塊以及其對應的功能都可以從功能模塊表和功能表中讀出,如圖3所示。

 

    在將新角色普通會員插入數據庫時,先將角色值的所有位都置爲0,然後利用.NET Framework 類庫中的Replace函數將角色值中的打上勾的功能相應的功能編號位的值改爲1。

    例如,新添加一個角色名爲普通會員的角色,它擁有的功能爲商品信息查詢(功能編號0)和商品定價信息查詢(功能編號3)兩項,則角色值應爲1001000……00(100位),即角色值中第0位和第3位的值爲1,其餘爲0。

    3、利用用戶控件實現訪問權限

    在定義好用戶控件.ascx文件(head.ascx)及.ascx.cs(head.ascx,cs)文件時,接下去只要在.aspx文件中註冊和聲明它就可以了。

    (1) 註冊

<%@ Register TagPrefix="Acme" TagName="Head" Src="../UserControl/headinner.ascx" %>

    (2) 聲明

    經過實踐,在.aspx文件中聲明.ascx文件可分爲幾種情況:

  第一種情況:<Acme:Head runat="server" />

  第二種情況:<Acme:Head runat="server" flag=0 funcname1=selectgoods funcname2=updategoods />

  第三種情況:<Acme: Head runat="server" flag=1 funcname1= selectgoods funcname2=updategoods />

    字段flag是用來控制怎樣進行權限檢查的標誌,funcname指功能表中的功能英文名。如果flag爲空,則不執行權限檢查(第一種情況);否則如果flag=="0",則表示同時具有selectgoods(商品信息查詢)和 updategoods(商品信息更新)這兩種權限的角色所對應的用戶纔有權利查看該頁(第二種情況);否則,如果flag=="1",則認爲,具有selectgoods(商品信息查詢)或 updategoods(商品信息更新)這兩種權限中任意一種權限的用戶就有權利查看該頁(第三種情況)。

 上面進行權限檢查的過程全部由用戶控件來實現,其全部方法都封裝在.ascx.cs文件中,其中最主要的一個方法是檢查某一角色是否擁有某一確定權限的checkAuth(string roleId,string funcEName)方法。這個方法的思想如圖4所示。

    圖4中roleValue(角色值)的第0位(selectgoods的功能編號)值爲1,表示該角色擁有selectgoods(商品信息查詢)的權限。這樣,我們把對權限檢查的所有邏輯都封裝在了用戶控件中,因此,對WEB窗體頁.aspx文件而言,只需在導入.ascx文件時確定用戶在訪問該頁面時所應擁有的權限,而不需對aspx.cs進行任何改動。

    由上所述,可以很清楚地看出,只要在用戶控件中對用戶權限進行控制,再把它包括在.aspx文件中(這件事作者本來就是要做的),那麼在編程的時候就不必考慮複雜的權限問題了。

    結束語

    本文在開發一個電子商務系統的實踐中發現,公司對系統用戶的權限控制非常重視。因此,設計一個簡單方便又行之有效的權限控制機制對於電子商務系統是必不可少的。本文所提出的基於ASP.NET的電子商務系統用戶權限設計和實現方法已經在實際的工作中得到了驗證,修改指定權限組的操作變得非常方便。

0
0
(請您對文章做出評價)

用戶權限設計(二)——用戶認證管理設計方案【轉】

用戶認證管理設計方案

1 設計思路
爲了設計一套具有較強可擴展性的用戶認證管理,需要建立用戶、角色和權限等數據庫表,並且建立之間的關係,具體實現如下。
1.1 用戶
用戶僅僅是純粹的用戶,用來記錄用戶相關信息,如用戶名、密碼等,權限是被分離出去了的。用戶(User)要擁有對某種資源的權限,必須通過角色(Role)去關聯。
用戶通常具有以下屬性:
ü         編號,在系統中唯一。
ü         名稱,在系統中唯一。
ü         用戶口令。
ü         註釋,描述用戶或角色的信息。
1.2 角色
角色是使用權限的基本單位,擁有一定數量的權限,通過角色賦予用戶權限,通常具有以下屬性:
ü         編號,在系統中唯一。
ü         名稱,在系統中唯一。
ü         註釋,描述角色信息
1.3 權限
       權限指用戶根據角色獲得對程序某些功能的操作,例如對文件的讀、寫、修改和刪除功能,通常具有以下屬性:
ü         編號,在系統中唯一。
ü         名稱,在系統中唯一。
ü         註釋,描述權限信息
1.4 用戶與角色的關係
一個用戶(User)可以隸屬於多個角色(Role),一個角色組也可擁有多個用戶,用戶角色就是用來描述他們之間隸屬關係的對象。用戶(User)通過角色(Role)關聯所擁有對某種資源的權限,例如
l         用戶(User):
UserID      UserName      UserPwd
1                   張三                 xxxxxx
2                   李四                 xxxxxx    
……
l         角色(Role):
RoleID           RoleName          RoleNote
       01                  系統管理員       監控系統維護管理員
       02                  監控人員          在線監控人員
       03                  調度人員          調度工作人員
       04                  一般工作人員   工作人員
       ……
l         用戶角色(User_Role):
UserRoleID           UserID           RoleID           UserRoleNote
1                       1                   01                  用戶“張三”被分配到角色“系統管理員”
2                        2                   02                  用戶“李四”被分配到角色“監控人員”
3                        2                   03                  用戶“李四”被分配到角色“調度人員”
……
       從該關係表可以看出,用戶所擁有的特定資源可以通過用戶角色來關聯。
1.5 權限與角色的關係
一個角色(Role)可以擁有多個權限(Permission),同樣一個權限可分配給多個角色。例如:
l         角色(Role):
RoleID           RoleName          RoleNote
       01                  系統管理員       監控系統維護管理員
       02                  監控人員          在線監控人員
       03                  調度人員          調度工作人員
       04                  一般工作人員   工作人員
       ……
l         權限(Permission):
PermissionID      PermissionName       PermissionNote
0001                        增加監控                 允許增加監控對象
0002                        修改監控                 允許修改監控對象
0003                        刪除監控                 允許刪除監控對象
0004                        察看監控信息       允許察看監控對象
……
l         角色權限(Role_Permission):
RolePermissionID   RoleID PermissionID RolePermissionNote
1                             01            0001        角色“系統管理員”具有權限“增加監控”
2                             01            0002        角色“系統管理員”具有權限“修改監控”
3                             01            0003        角色“系統管理員”具有權限“刪除監控”
4                             01            0004        角色“系統管理員”具有權限“察看監控”
5                             02            0001        角色“監控人員”具有權限“增加監控”
6                             02            0004        角色“監控人員”具有權限“察看監控”
……
       由以上例子中的角色權限關係可以看出,角色權限可以建立角色和權限之間的對應關係。
1.6 建立用戶權限
用戶權限系統的核心由以下三部分構成:創造權限、分配權限和使用權限。
第一步由Creator創造權限(Permission),Creator在設計和實現系統時會劃分。利用存儲過程CreatePermissionInfo(@PermissionName,@PermissionNote)創建權限信息,指定系統模塊具有哪些權限。
第二步由系統管理員(Administrator)創建用戶和角色,並且指定用戶角色(User-Role)和角色權限(Role-Permission)的關聯關係。

1)        具有創建用戶、修改用戶和刪除用戶的功能: Administrator

l         存儲過程CreateUserInfo(@UserName,@UserPwd)創建用戶信息;
l         存儲過程ModifyUserInfo(@UserName,@UserPwd)修改用戶信息;
l         存儲過程DeleteUserInfo(@UserID)刪除用戶信息;

2)        具有創建角色和刪除角色的功能: Administrator

l         存儲過程CreateRoleInfo(@RoleName,@RoleNote)創建角色信息;
l         存儲過程DeleteRoleInfo(@RoleID)刪除角色信息;
3)Administrator具有建立用戶和角色、角色和權限的關聯關係功能:
l         存儲過程GrantUserRole(@UserID,@RoleID,@UserRoleNote)建立用戶和角色的關聯關係;
l         存儲過程DeleteUserRole(@UserRoleID)刪除用戶和角色的關聯關係;
l         存儲過程GrantRolePermission(@RoleID,@PermissionID,@RolePermissionNote)建立角色和權限的關聯關係;
l         存儲過程DeleteRolePermission(@RolePermissionID)刪除角色和權限的關聯關係;
第三步用戶(User)使用Administrator分配給的權限去使用各個系統模塊。利用存儲過程GetUserRole(@UserID, @UserRoleID output),GetRolePermission(@RoleID,@Role-
-PermissinID output)獲得用戶對模塊的使用權限。
1.7 用戶認證實現
當用戶通過驗證後,由系統自動生成一個128位的TicketID保存到用戶數據庫表中,建立存儲過程Login(@UserID,@UserPwd,@TicketID output)進行用戶認證,認證通過得到一個TicketID,否則TicketID爲null。其流程圖如下:
圖1 Login流程圖
得到TicketID後,客戶端在調用服務端方法時傳遞TicketID,通過存儲過程JudgeTicketPermission(@TicketID,@PermissionID)判斷TicketID對應的用戶所具有的權限,並根據其權限進行方法調用。
當用戶退出系統時,建立存儲過程Logout(@UserID)來退出系統。當用戶異常退出系統時,根據最後的登陸時間(LastSignTime)確定用戶的TickeID,建立存儲過程ExceptionLogout(@UserID,@LastSignTime)處理用戶的異常退出。
圖2 Logout流程圖
WebService可以採用SoapHeader中寫入TicketID來使得TicketID從客戶端傳遞給服務端。.Net Remoting可以採用CallContext類來實現TicketID從客戶端傳遞給服務端。
2 數據庫設計
2.1 數據庫表
圖3 數據庫關係圖
2.2 數據庫表說明
2.2.1 用戶表(Static_User)
Static_User

Static_User字段名

詳細解釋

類型

備註

UserID

路線編號

varchar(20)

PK

UserName

用戶名稱

varchar(20)

 

 

UserPwd

用戶密碼

varchar(20)

 

 

LastSignTime

最後登陸時間

datatime

 

 

SignState

用戶登陸狀態標記

int

 

 

TickeID

驗證票記錄編號

varchar(128)

 

 

 

 

 

 

 

 

 

 

 

 

2.2.2 角色表(Static_Role)
Static_Role

Static_User字段名

詳細解釋

類型

備註

RoleID

角色編號

varchar(20)

PK

RoleName

角色名稱

varchar(20)

 

 

RoleNote

角色信息描述

varchar(20)

 

 

 

 

 

 

 

 

 

 

 

2.2.3 用戶-角色表(Static_User_Role)
Static_User_Role

Static_User字段名

詳細解釋

類型

備註

UserRoleID

用戶角色編號

varchar(20)

PK

UserID

用戶編號

varchar(20)

FK

RoleID

角色編號

varchar(20)

FK

UserRoleNote

用戶角色信息描述

varchar(20)

 

 

 

 

 

 

 

 

 

 

 

2.2.4 權限表(Static_Permission)
Static_Permission

Static_User字段名

詳細解釋

類型

備註

PermissionID

編號

varchar(20)

PK

PermissionName

權限名稱

varchar(20)

 

 

PermissionNote

全息信息描述

varchar(20)

 

 

 

 

 

 

 

 

 

 

 

2.2.5 角色-權限表(Static_Role_Permission)
Static_Role_Permission

Static_User字段名

詳細解釋

類型

備註

RolePermissionID

角色權限編號

varchar(20)

PK

RoleID

角色編號

varchar(20)

FK

PermissionID

權限編號

varchar(20)

FK

RolePermissionNote

角色權限信息描述

varchar(20)

 

 

 

 

 

 

 

 

 

 
3 .net技術概要
3.1 WebService SoapHeader
對 SQL 數據庫執行自定義身份驗證和授權。在這種情況中,應向服務傳遞自定義憑據(如用戶名和密碼),並讓服務自己處理身份驗證和授權。 將額外的信息連同請求一起傳遞給 XML Web 服務的簡便方法是通過 SOAP 標頭。爲此,需要在服務中定義一個從 SOAPHeader 派生的類,然後將服務的公共字段聲明爲該類型。這在服務的公共合同中公開,並且當從 WebServiceUtil.exe 創建代理時可由客戶端使用,如下例所示:

 

 

using System.Web.Services;

using System.Web.Services.Protocols;

 

// AuthHeader class extends from SoapHeader

public class AuthHeader : SoapHeader {

    public string Username;

    public string Password;

}

 

public class HeaderService : WebService {

    public AuthHeader sHeader;

    ...

}
服務中的每個 WebMethod 都可以使用 SoapHeader 自定義屬性定義一組關聯的標頭。默認情況下,標頭是必需的,但也可以定義可選標頭。SoapHeader 屬性指定公共字段的名稱或者 Client 或 Server 類的屬性(本標題中稱爲 Headers 屬性)。在爲輸入標頭調用方法前,WebService 設置 Headers 屬性的值;而當方法爲輸出標頭返回時,WebService 檢索該值。

[WebMethod(Description="This method requires a custom soap header set by the caller")]

[SoapHeader("sHeader")]

public string SecureMethod() {

 

if (sHeader == null)

return "ERROR: Please supply credentials";

else

return "USER: " + sHeader.Username;

 

}

然後,客戶端在調用要求標頭的方法之前,直接在代理類上設置標頭,如下面的示例所示:

HeaderService h = new HeaderService();

AuthHeader myHeader = new AuthHeader();

myHeader.Username = "username";

myHeader.Password = "password";

h.AuthHeader = myHeader;

String result = h.SecureMethod();

3.2 .Net Remoting的安全認證方式
CallContext提供與執行代碼路徑一起傳送的屬性集,CallContext是類似於方法調用的線程本地存儲的專用集合對象,並提供對每個邏輯執行線程都唯一的數據槽。數據槽不在其他邏輯線程上的調用上下文之間共享。當 CallContext 沿執行代碼路徑往返傳播並且由該路徑中的各個對象檢查時,可將對象添加到其中。當對另一個 AppDomain 中的對象進行遠程方法調用時,CallContext 類將生成一個與該遠程調用一起傳播的 LogicalCallContext 實例。只有公開 ILogicalThreadAffinative 接口並存儲在 CallContext 中的對象被在 LogicalCallContext 中傳播到 AppDomain 外部。不支持此接口的對象不在 LogicalCallContext 實例中與遠程方法調用一起傳輸。
CallContext.SetData方法存儲給定對象並將其與指定名稱關聯,CallContext.GetData方法從 CallContext 中檢索具有指定名稱的對象。
下面的代碼示例說明如何使用 SetData 方法將主體和標識對象傳輸到遠程位置以進行標識。

public class ClientClass {

   public static void Main() {

      GenericIdentity ident = new GenericIdentity("Bob");

      GenericPrincipal prpal = new GenericPrincipal(ident,

                                          Newstring[] {"Level1"});

      LogicalCallContextData data =

 new LogicalCallContextData(prpal);

      //Enter data into the CallContext

      CallContext.SetData("test data", data);

 

     

      Console.WriteLine(data.numOfAccesses);

      ChannelServices.RegisterChannel(new TcpChannel());

      RemotingConfiguration.RegisterActivatedClientType(

typeof(HelloServiceClass), "tcp://localhost:8082");

      HelloServiceClass service = new HelloServiceClass();

      if(service == null) {

          Console.WriteLine("Could not locate server.");

          return;

      }

 

      // call remote method

      Console.WriteLine();

      Console.WriteLine("Calling remote object");

      Console.WriteLine(service.HelloMethod("Caveman"));

      Console.WriteLine(service.HelloMethod("Spaceman"));

      Console.WriteLine(service.HelloMethod("Bob"));

      Console.WriteLine("Finished remote object call");

      Console.WriteLine();

 

      //Extract the returned data from the call context

      LogicalCallContextData returnedData =

         (LogicalCallContextData)CallContext.GetData("test data");

 

      Console.WriteLine(data.numOfAccesses);

      Console.WriteLine(returnedData.numOfAccesses);

   }

}

下面的代碼示例說明如何使用 GetData 方法將主體和標識對象傳輸到遠程位置以進行標識。

using System;

using System.Text;

using System.Runtime.Remoting.Messaging;

using System.Security.Principal;

 

public class HelloServiceClass : MarshalByRefObject {

   static int n_instances;

   int instanceNum;

 

   public HelloServiceClass() {

      n_instances++;

      instanceNum = n_instances;

      Console.WriteLine(this.GetType().Name + " has been created.

             Instance # = {0}", instanceNum);

   }

 

  ~HelloServiceClass() {

      Console.WriteLine("Destroyed instance {0} of

HelloServiceClass.", instanceNum);     

   }

 

   public String HelloMethod(String name) {

 

      //Extract the call context data

      LogicalCallContextData data =

          (LogicalCallContextData)CallContext.GetData("test data");     

      IPrincipal myPrincipal = data.Principal;

     

      //Check the user identity

      if(myPrincipal.Identity.Name == "Bob") {

         Console.WriteLine("/nHello {0}, you are identified!",

myPrincipal.Identity.Name);

         Console.WriteLine(data.numOfAccesses);

      }

      else {

         Console.WriteLine("Go away! You are not identified!");

         return String.Empty;

      }

 

        // calculate and return result to client   

      return "Hi there " + name + ".";

   }

}

4 詳細代碼設計
4.1 WebService代碼設計
WebService端代碼主要進行對數據庫的操作,建立起Client操作數據庫所需要的方法,供Client的端調用。

1)class UserInfoMng() 用戶信息管理類,其中包括方法:

l         CreateUserInfo(string UserName string UserPwd) 建立用戶信息,調用存儲過程CreateUserInfo(@UserName,@UserPwd)

l         ModifyUserInfo(string UserName string UserPwd) 修改用戶信息,調用存儲過程ModifyUserInfo(@UserName,@UserPwd)

l         DeleteUserInfo() 刪除用戶信息,調用存儲過程DeleteUserInfo

(@UserID)

2)class UserAuthentication() 用戶認證類,用來實現用戶角色、權限的設置,包括方法:

l         CreatePermissionInfo(string PermissionName string Permissi-

-onNote) 建立權限信息,調用存儲過程CreatePermissionInfo

(@PermissionName,@PermissionNote)

l         CreateRoleInfo(string RoleName string RoleNote) 建立角色信息,調用存儲過程CreateRoleInfo(@RoleName,@RoleNote)

l         DeleteRoleInfo() 刪除角色信息,調用存儲過程DeleteRoleInfo

(@RoleID)

l         GrantUserRole(string UserID string RoleID string UserRoleNote) 授予用戶角色,調用存儲過程GrantUserRole(@UserID,@RoleID,

@UserRoleNote)

l         DeleteUserRole() 刪除用戶角色,調用存儲過程DeleteUserRole

(@UserRoleID)

l         GrantRolePermission(string RoleID string PermissionID string RolePermissionNote) 授予角色權限,調用存儲過程GrantRolePermission(@RoleID,@PermissionID,@RolePermissionNote)

l         DeleteRolePermission() 刪除授予的角色權限,調用存儲過程

DeleteRolePermission(@RolePermissionID)

4.2 用戶認證代碼設計(Client端)
Client端調用WebService方法來進行數據庫訪問,Client端代碼設計主要實現界面的功能,包括:權限設置、用戶管理、用戶授權管理和用戶認證管理

1)權限設置

class PermissionInfoMng() 用戶權限信息管理類,包括方法:

l         CreatePermissionInfo() 建立權限信息

2)用戶管理

class UserInfoMng() 用戶信息管理類,包括方法:

l         CreateUserInfo() 建立用戶信息

l         ModifyUserInfo() 修改用戶信息

l         DeleteUserInfo() 刪除用戶信息

3)用戶授權管理

class RoleInfoMng() 角色信息管理類,包括方法:

l         CreateRoleInfo() 建立角色信息

l         DeleteRoleInfo() 刪除角色信息

class UserRoleMng() 用戶角色管理類,包括方法:

l         GrantUserRole() 授予用戶角色

l         DeleteUserRole() 刪除用戶角色

class RolePermissionMng() 角色權限管理類,包括方法

l         GrantRolePermission() 授予角色權限

l         DeleteRolePermission() 刪除角色權限

4)用戶認證管理

class Authentication() 用戶認證類,包括方法:

l         Login(string UserName string UserPwd) 用戶登陸認證,用戶認證通過分配給用戶一個TicketID,否則TicketID則爲null

l         Logout() 用戶正常退出

l         ExceptionLogout() 用戶異常退出

用戶權限設計(三)——通用數據權限管理系統設計【轉】

作者:逸雲
 
前言:
 本文提供一種集成功能權限和數據權限的解決方法,以滿足多層次組織中權限管理方面的集中控制。本方法是RBAC(基於角色的訪問控制方法)的進一步擴展和延伸,即在功能權限的基礎上增加數據權限的管理,實現數據權限和功能權限的集中處理。
 
解釋:
 功能權限:能做什麼的問題,如增加銷售訂單;
 數據權限:能在哪裏幹什麼的問題,如察看北京分公司海淀銷售部張三的銷售訂單;
 
術語:
 資源:系統中的資源,主要是各種業務對象,如銷售單、付款單等;
 操作類型:對資源可能的訪問方法,如增加、刪除、修改等;
 功能:對資源的操作,是資源與操作類型的二元組,如增加銷售單、修改銷售單等;
 數據類型:業務系統中常用的數據權限類型,如公司、部門、項目、個人等;
 數據對象:具體的業務對象,如甲公司、乙部門等等,包括所有涉及到數據權限的對象值;
 權限:角色可使用的功能,分角色的功能權限和角色的數據權限;
 角色:特定權限的集合;
 用戶:參與系統活動的主體,如人,系統等。
 
 
通用數據權限管理系統設計(二)
 
方法說明:
 在實際應用中,數據權限的控制點一般相對固定,如針對公司、部門、個人、客戶、供應商等,也就是說數據權限一般針對指定數據類型下的一些數據對象。
 
 本方法中,數據權限的依賴於功能權限,是對功能權限的進一步描述,說明角色在指定的功能點上的數據控制權限。
本方法中採用“沒有明確規定即視爲有效”的原則,如果沒有定義功能的數據權限,則說明該角色具有該功能的全部的權限。如果定義了功能的某種類型的數據權限,則該用戶只具有該類型下指定數據的數據權限。
 
 這段話比較繞口,下面舉個例子實際例子。
 
 某公司有北京銷售部、上海銷售部和廣州銷售部三個銷售部,現在需要定義幾種角色:
    銷售總監      -- 能察看所有銷售部的銷售訂單;
    北京銷售經理 -- 只能察看北京銷售部的所有銷售訂單;
    上海銷售經理 -- 只能察看上海銷售部的所有銷售訂單;  
    廣州銷售經理 -- 只能察看廣州銷售部的所有銷售訂單;  
 
 上述角色的定義如下:
 
     -------------------------------------------------------------------
     角色名稱             功能             數據類型     數據對象  
     -------------------------------------------------------------------
     銷售總監           察看銷售訂單                                 
     北京銷售經理       察看銷售訂單         部門         北京  
     上海銷售經理       察看銷售訂單         部門         上海     
     廣州銷售經理       察看銷售訂單         部門         廣州     
     -------------------------------------------------------------------
 
    上述定義中,銷售總監只定義了功能權限,而沒有定義數據權限,所以銷售總監能夠察看所有的銷售訂單;而其他幾位銷售經理分別定義了這一功能的數據權限,所以只能察看指定部門的銷售訂單。
 
     在實際應用中,往往會出現部門分組,組長能夠察看本組所有人員處理的銷售訂單的情況,以及某些情況下,某些人只能察看本人的銷售訂單的情況,這些特殊情況在上述的說明中無法解決,需要在設計和實現中進行處理。
 
 
    北京銷售代表 -- 只能察看北京銷售部的本人的所有銷售訂單;  
     北京銷售代表         察看銷售訂單           部門            北京     
                                                 個人                  
 
 
通用數據權限管理系統設計(三)--數據庫設計
 
我們先來看看傳統的基於角色的權限管理系統,如下圖所示,最簡單的基於角色的權限管理由系統功能、系統角色、系統用戶、角色功能和用戶角色五部分組成。
    圖一:基於角色的數據庫結構
爲實現數據權限控制,在設計上對基於角色的權限管理進行擴充,如下圖所示:
 
圖二:通用數據權限管理系統數據庫設計
對比兩張圖,我們可以看到,他們之間的主要變化爲:
1、 增加系統資源信息和操作類型信息,系統資源爲樹形結構、如銷售模塊、銷售訂單等;操作類型記錄可能的操作,如增加、刪除、修改、查看、查詢等,系統功能是資源與操作類型的組合,對資源的操作就是系統功能。
2、 增加數據對象類型和數據對象兩張表,數據對象類型記錄系統中需要控制的對象類型,如部門、庫房、員工、客戶、供應商等;數據對象記錄各對象類型的對象實例,如北京銷售部、上海銷售部、張三、李四等等。(獨立保存的好處後面會說到)
3、 增加系統資源與數據對象類型的關聯表(多對多),本表爲配置表,說明某種資源可能需要的控制點,如銷售訂單與部門類型的關聯可能涉及到分部門分配權限;銷售訂單與客戶的關聯可能涉及到按客戶分配權限等等。
4、 增加數據對象與角色權限的關聯,這張表是真正最終實現數據權限管理的所在地。
 
通過這種設計,能夠最小化地減少對原有權限系統的更改,並且可以很靈活地增加數據的控制點。在產品化軟件的設計中使用,能夠靈活滿足客戶的需要。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章