全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1459
推到 Plurk!
推到 Facebook!

如何運用Object Factories(物件工廠) 樣式設計權限控管?

 
bruce
中階會員


發表:19
回覆:121
積分:83
註冊:2002-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-03 21:55:07 IP:218.164.xxx.xxx 未訂閱
權限控管幾乎是所有系統設計面臨的問題,一般的設計觀念就是動態產生一個物件去對應一個使用者,也就是說使用一個權限物件對應到一個使用者,這樣的對應關係,在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-08 15:51:52 IP:61.216.xxx.xxx 未訂閱
感謝你提供概念供學習,有範例可參考嗎?謝謝! Delphi follower
------
Delphi
bruce
中階會員


發表:19
回覆:121
積分:83
註冊:2002-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-09 15:52:03 IP:218.164.xxx.xxx 未訂閱
引言: 感謝你提供概念供學習,有範例可參考嗎?謝謝! Delphi follower
Hi 您好,以下我用一個可執行的的範例,說明這個樣式的運用概念。 // 使用端: // 放一個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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-30 09:19:59 IP:211.147.xxx.xxx 未訂閱
这样的权限控制过于简单了,如果我想控制我的DBGrid中的某一行数据的修改,那么这样的设计似乎不是很符合要求。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-06 11:53:38 IP:219.133.xxx.xxx 未訂閱
引言: 这样的权限控制过于简单了,如果我想控制我的DBGrid中的某一行数据的修改,那么这样的设计似乎不是很符合要求。
作者在这里是提出一中权限控制的思路。这样的思路很重要。 至于你说的控制DBGrid中的某一行数据,这是权限控制里所谓的“粒度”问题。 在写程序的时候,所有的东西都可以看做是对象。但对象也有层次。权限控制究竟需要细到哪个层次,是具体的程序根据需求来决定的。
bruce
中階會員


發表:19
回覆:121
積分:83
註冊:2002-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-09 14:23:00 IP:61.219.xxx.xxx 未訂閱
引言:
引言: 这样的权限控制过于简单了,如果我想控制我的DBGrid中的某一行数据的修改,那么这样的设计似乎不是很符合要求。
作者在这里是提出一中权限控制的思路。这样的思路很重要。 至于你说的控制DBGrid中的某一行数据,这是权限控制里所谓的“粒度”问题。 在写程序的时候,所有的东西都可以看做是对象。但对象也有层次。权限控制究竟需要细到哪个层次,是具体的程序根据需求来决定的。
很贊同 pcplayer99兄的見解: 究竟需要细到哪个层次,是具体的程序根据需求来决定的。 補充解釋如下:因此,不管控制多細,所以最終仍以程序控制權限。
kkkchen
一般會員


發表:0
回覆:2
積分:0
註冊:2004-10-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-26 01:03:30 IP:61.144.xxx.xxx 未訂閱
引言:
引言: 这样的权限控制过于简单了,如果我想控制我的DBGrid中的某一行数据的修改,那么这样的设计似乎不是很符合要求。
作者在这里是提出一中权限控制的思路。这样的思路很重要。 至于你说的控制DBGrid中的某一行数据,这是权限控制里所谓的“粒度”问题。 在写程序的时候,所有的东西都可以看做是对象。但对象也有层次。权限控制究竟需要细到哪个层次,是具体的程序根据需求来决定的。
在权限管理中系统,我认为应该具备以下几种特征。 1:资源定义:定义系统中需要被控制的资源 2:角色定义:定义角色所能够存取的资源 3:用户定义:定义对应角色的用户,一个用户可以属于多个角色(具备多种权限) 4:验证方法:根据当前用户,验证其是否拥有访问当前资源的权限。 我觉得这样的设计具备更加大的灵活性,粒度可自由定义,当然你要控制的粒度越小,验证方法调用就应该在更加底层的地方。
bruce
中階會員


發表:19
回覆:121
積分:83
註冊:2002-04-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-26 09:07:58 IP:61.219.xxx.xxx 未訂閱
[/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
系統時間:2024-05-19 17:02:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!