如何運用Object Factories(物件工廠) 樣式設計權限控管? |
|
bruce
中階會員 發表:19 回覆:121 積分:83 註冊:2002-04-16 發送簡訊給我 |
權限控管幾乎是所有系統設計面臨的問題,一般的設計觀念就是動態產生一個物件去對應一個使用者,也就是說使用一個權限物件對應到一個使用者,這樣的對應關係,在Delphi中我們很輕易的可以找到一個物件TMainMenu,動態產生這個物件去對應不同權限的使用者。 以物件工廠的觀念來說,權限物件要對應到哪一個使用還在其次,重要的是如何去產生這些對應的權限物件。以Delphi來說,你可以用TDataModule 去設計這個物件工廠,在TDataModule裡面,放進數個TMainMenu ,當使用者Login 到系統時,丟出適當的TMainMenu物件去對應,即可完成權限的控制。 使用端你可以這樣寫:
application.Mainform.menu:=DataModule1.getmenu(UserLevel) 寫到這裡,有一個問題,就是UserLevel,物建工廠提供一個GetMenu的方法供外界存取權限,同時物件工廠必須針對UserLevel提供不同等級的使用權限,因此,我們繼續看GetMenu要如何運作呢? function getmenu(Userlevel:integer):TMainmenu
begin
case UserLevel of
0:result:=TmainMenu1;
1:result:=TmainMenu2;
2:result:=TmainMenu3;
end;
這樣簡單的程式碼,我相信大家都看的懂,運用物件工廠概念,這樣就已經完成一個權限控管的基本架構了。 接下來你可能會問,那這些TMainmenu 又是如何設定權限的呢?其實這又是另一個課題了。通常解決一個問題,單單運用一種樣式,還是不夠的,必須聯合使用其他的樣式,才能解決一個複雜的問題,但在面對複雜的問題,你必須逐步分解成簡單的步驟。 希望留下一個可以討論的空間,以下的就留給大家去討論了。
或者等有空再繼續談另一個樣式,小孩子吵著要用電腦了。
|
ying0515
中階會員 發表:90 回覆:168 積分:81 註冊:2003-01-04 發送簡訊給我 |
|
bruce
中階會員 發表:19 回覆:121 積分:83 註冊:2002-04-16 發送簡訊給我 |
引言: 感謝你提供概念供學習,有範例可參考嗎?謝謝! Delphi followerHi 您好,以下我用一個可執行的的範例,說明這個樣式的運用概念。 // 使用端: // 放一個TCombobox,一個TButtom,由Combobox1決定權限 // 呼叫權限物件 dm1.CreateMenu( combobox1.itemindex ); unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ComboBox1: TComboBox; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin if combobox1.itemindex>=0 then self.menu:=dm1.CreateMenu( combobox1.itemindex ); end; end. // 權限物件 // 使物TDataModule ,上面放了三個TMainmenu 物件,各自定義出一不同權限 // 建構一個方法,CreateMenu(UserLevel: integer): TMainMenu;供使用端使用 unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus; type Tdm1 = class(TDataModule) MainMenu1: TMainMenu; MainMenu2: TMainMenu; MainMenu3: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; private { Private declarations } public { Public declarations } Function CreateMenu(UserLevel:integer):TMainMenu; end; var dm1: Tdm1; implementation {$R *.DFM} { Tdm1 } function Tdm1.CreateMenu(UserLevel: integer): TMainMenu; begin case UserLevel of 0:result:=Mainmenu1; 1:result:=Mainmenu2; 2:result:=Mainmenu3; end; end; end. |
kkkchen
一般會員 發表:0 回覆:2 積分:0 註冊:2004-10-21 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
bruce
中階會員 發表:19 回覆:121 積分:83 註冊:2002-04-16 發送簡訊給我 |
引言:很贊同 pcplayer99兄的見解: 究竟需要细到哪个层次,是具体的程序根据需求来决定的。 補充解釋如下:因此,不管控制多細,所以最終仍以程序控制權限。引言: 这样的权限控制过于简单了,如果我想控制我的DBGrid中的某一行数据的修改,那么这样的设计似乎不是很符合要求。作者在这里是提出一中权限控制的思路。这样的思路很重要。 至于你说的控制DBGrid中的某一行数据,这是权限控制里所谓的“粒度”问题。 在写程序的时候,所有的东西都可以看做是对象。但对象也有层次。权限控制究竟需要细到哪个层次,是具体的程序根据需求来决定的。 |
kkkchen
一般會員 發表:0 回覆:2 積分:0 註冊:2004-10-21 發送簡訊給我 |
引言:在权限管理中系统,我认为应该具备以下几种特征。 1:资源定义:定义系统中需要被控制的资源 2:角色定义:定义角色所能够存取的资源 3:用户定义:定义对应角色的用户,一个用户可以属于多个角色(具备多种权限) 4:验证方法:根据当前用户,验证其是否拥有访问当前资源的权限。 我觉得这样的设计具备更加大的灵活性,粒度可自由定义,当然你要控制的粒度越小,验证方法调用就应该在更加底层的地方。引言: 这样的权限控制过于简单了,如果我想控制我的DBGrid中的某一行数据的修改,那么这样的设计似乎不是很符合要求。作者在这里是提出一中权限控制的思路。这样的思路很重要。 至于你说的控制DBGrid中的某一行数据,这是权限控制里所谓的“粒度”问题。 在写程序的时候,所有的东西都可以看做是对象。但对象也有层次。权限控制究竟需要细到哪个层次,是具体的程序根据需求来决定的。 |
bruce
中階會員 發表:19 回覆:121 積分:83 註冊:2002-04-16 發送簡訊給我 |
[/quote]
在权限管理中系统,我认为应该具备以下几种特征。
1:资源定义:定义系统中需要被控制的资源
2:角色定义:定义角色所能够存取的资源
3:用户定义:定义对应角色的用户,一个用户可以属于多个角色(具备多种权限)
4:验证方法:根据当前用户,验证其是否拥有访问当前资源的权限。 我觉得这样的设计具备更加大的灵活性,粒度可自由定义,当然你要控制的粒度越小,验证方法调用就应该在更加底层的地方。
[/quote] 非常贊同以上的看法。 由於本文只是講到權限控制中,使用者與使用資源的對應關係,若以整個權限控制來說,是太夠簡略。 補充意見如下: 除了定義之外,還要描述彼此之間的對應關係,關於資源的定義,建議使用TActionList定義出所有控制資源,再根據角色定義,設計出TMenuItem 去取用這些資源。 接下來,就是如本文所描述,根據不同角色(本文中略過了角色定義,只虛擬了一個UserLevel參數),輸出不同的TMenuItem。 function getmenu(Userlevel:integer):TMainmenu
begin
case UserLevel of
0:result:=TmainMenu1;
1:result:=TmainMenu2;
2:result:=TmainMenu3;
end; 關於驗證方法,我的想法亦由定義出的Userlevel進行資源的取用及驗證。 謝謝KKKchen兄的回應與指教,您的物件觀念很清晰,也具備UML概念。 發表人 - bruce 於 2005/05/26 09:09:28
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |