在軟件開發中,爲軟件加入權限控制功能,使不一樣的用戶有不一樣的使用權限,是很是重要的一項功能,由其在開發數據庫方面的應用,這項功能更爲重要。
可是,要爲一個應用加入全面的權限控制功能,又怎樣實現呢?
你們知道,如今的應用,通常均以菜單訪問功能的形式出現,按照常規的作法,只要讓註冊進入應用的不一樣用戶,能夠訪問不一樣的功能菜單,從而實現功能權限的控制,
可是,有這樣一個問題,此種方法便無能爲力,如今的應用軟件,爲了提升軟件的易操做性,同一功能可能有多種不一樣的訪問方式,如工具條,右鍵菜單等;一樣,同一個功能,也可能在軟件的不一樣地方被調用,而不單單被限制爲用程序的主菜單來調用,這樣,才能保證應用的易用性。
寫到這,問題已經很是清楚,對於要限制的軟件功能,僅經過一次代碼設計,不管在整個應用的任何地方或經過何種形式調用此功能,都能被功能權限所限制。
筆者利用Delphi平臺做應用開發時,經過Delphi7提供的VCL控件解決了這一問題。在瞭解如何實現功能權限控制以前,得先看一下Delphi7提供的新控件TActionList,
經過TActionList,應用程序能夠統一管理其TAction,這裏的Action,能夠理解爲應用程序的功能。在應用的設計期間,能夠經過TActionList編輯器將功能(Action)加入TActionList,
將Action加入TActionList後,就可能經過Object Inspector設置Action的屬性或爲其創建事件句柄。在這裏,咱們能夠用Action的OnExecute事件句柄實現具體的功能,以下代碼來顯示一個操做窗體:
procedure TfrmMain.SetUserExecute(Sender: TObject);
begin
frmUser.showModal;
end;
當要限定這一功能時,可能利用TAction的Enabled,將其設爲False,此功能對於用戶將被屏蔽掉,若是要此功能對用戶不可見,則能夠設定Visible爲False。
當成功能的創建了TActionList後,可能有人問,若是使用其中的Action,在Delphi7中,象TButton、TMenuItem、TSpeedButton、TRadioButton等控件,均有一個屬性Action,正是經過它,咱們能夠將Menu或Button鏈接到TActionList中TAction,從而實現功能按鈕或菜單的功能。
在理解了Delphi中的TActionList及TAction以後,就能夠看看功能權限的具體實現方法。
第一步,創建兩張表,一張表存儲用戶信息,另外一張表存儲權限定義。
用戶信息表User結構以下:
UserID(String/用戶的ID號,爲表關鍵字)
UserName(String用戶名稱)
UserPassWord(String,用戶口令)
UserRight表結構以下:
UserID(String,用戶的ID號,爲表關鍵字)
ActionCaption(String,存儲功能的名稱,即Action的Caption屬性值)
ActionEnable(Boolean,存儲功能是否能夠訪問,即Action的Enable 屬性值)
ActionVisible(Boolean,存儲功能是否可見,即Action的visible屬性值)
第二步,增長用戶時填加用戶功能權限
當向User表中增長用戶時,須要向UserRight中增長功能設置記錄,先看看下面的實現代碼:
procedure TfrmUser.N1Click(Sender: TObject);
var
i:Integer;
Action:TAction;
begin
// Add Action into user right cds.
with frmMain do begin數據庫
for i:=0 to ActionList1.actioncount-1 do
begin
Action:=ActionList1.Actions[i];
cdsUserRight.AppendRecord([cdsUser.FieldByName(’userName’).AsString,TAction(Action).Caption,TAction(Action).Enabled,i]);數組
end;
end;
end;
在這段代碼中,用到了TActionList的兩個屬性,一個是ActionCount,另外一個是Actions。
ActionCount表示TactionList中有多少功能,
即Action,Actions是一個數組屬性,
經過索引可能訪問每個TAction,從而能夠設置其具體的屬性,象上面提到的Enable及Visible,
從而達到限制的目的,經過這段代碼,將應用程序的全部功能都加入了UserRight表中。
第三步,能夠用Grid對上一步產生的表進行編輯操做
第四步,利用第2、三步產生的功能限制表UserRight,限制用戶的權限,這能夠在應用程序的主窗體的OnCreate 中實現。
procedure TfrmMain.FormCreate(Sender: TObject);
const
testUser=’yh’;
var
cdsRight:TClientDataSet;
i:Integer;
begin
// set right of function
cdsRight:=TClientDataSet.Create(self);
try
cdsRight.LoadFromFile(’Right.CDS’);
cdsRight.AddIndex(’id’,’UserName;ActionCaption’,[],’’,’’,0);
cdsRight.IndexName:=’id’;
for i:=0 to ActionList1.ActionCount-1 do
begin
if cdsRight.FindKey([TestUser,TAction(ActionList1.Actions[i]).Caption]) then
TAction(ActionList1.Actions[i]).Enabled:=cdsRight.FieldByName(’ActionEnable’).AsBoolean;
end;
finally
cdsRight.Close;
cdsRight.Free;
end;
end;
這段代碼中,假設當前的用戶ID爲yh,同時只設定了功能的Enable屬性編輯器