經常在壇子裡看到有朋友問如何對軟體的登入使用者,進行權限控制,可以設定到每一個菜單或按鈕上,這裡來實作一個最普通的方法,通過資料庫,維護一個權限清單(裡面有一個字段和節目上菜單項或Button等的tag對應),在執行時,通過到資料庫去查詢與之比對的記錄是否開通,來決定使用者是否有權限。
資料庫結構:包括兩張表BaseData和UserRightData,BaseData中是一張基本表,裡面不區分使用者,UserRightData是使用者權限表,結構和BaseData一樣,隻是多了使用者字段,增加使用者時,就是從BaseData表中複制資料到UserRightData中,并辨別使用者ID。
字段說明:
FucCode:該字段與控件tag對應
FucName:功能名稱
IsSel:是否有權限的标志
IsFuc:辨別該項是否是可以執行的功能
FucPID:父節點ID,用來生成樹形結構時用
權限管理單元:UserRightCenter
<a></a>
unit UserRightCenter;
interface
uses
Windows, Messages, SysUtils, Classes, Forms, Dialogs,ADODB;
type
TUserRight = class
private
FConnection : TADOConnection;
FData: TADOQuery;
FUserID: Integer;
public
constructor Create(AConnection:TADOConnection);overload;
//根據使用者id建立對應的權限清單
function CreateRightListByUserID(uid:Integer):Boolean;
//根據使用者id取得對應的權限清單
function GetRightListByUserID(uid:Integer):Boolean;
//根據使用者id删除對應的權限清單
function DeleteRightListByUserID(uid:Integer):Boolean;
//根據記錄id設定某個功能是否可用,funid:記錄id,uid:使用者ID,issel:是否可用
procedure SetFunEnable(funid,uid,issel:Integer);
//判斷某個功能是否可用
function IsRightEnable(uid:Integer;fuccode:string):Boolean;
procedure ShowUserRigthView(uid:Integer);
property Connection: TADOConnection read FConnection;
property Data: TADOQuery read FData;
property UserID: Integer read FUserID write FUserID;
end;
implementation
UserRightView;
{ TUserRight }
constructor TUserRight.Create(AConnection: TADOConnection);
begin
FConnection := AConnection;
FData := TADOQuery.Create(nil);
FData.Connection := FConnection;
function TUserRight.CreateRightListByUserID(uid: Integer): Boolean;
Result := False;
DeleteRightListByUserID(uid);
FData.Close;
FData.SQL.Text := 'insert into UserRightData(fucid,fucpid,fuccode,fucname,IsFuc,IsSel,userid) '+
'select fucid,fucpid,fuccode,fucname,IsFuc,IsSel,'+IntToStr(uid)+' from BaseData';
FData.ExecSQL;
Result := True;
function TUserRight.DeleteRightListByUserID(uid: Integer): Boolean;
FData.SQL.Text := 'delete from UserRightData where userid='+IntToStr(uid);
function TUserRight.GetRightListByUserID(uid: Integer): Boolean;
FData.SQL.Text := 'select * from UserRightData where UserID='+IntToStr(uid);
FData.Open;
function TUserRight.IsRightEnable(uid:Integer;fuccode: string): Boolean;
FData.SQL.Text := 'select * from UserRightData where userid='+IntToStr(uid)+
' and fuccode='+fuccode;
if (FData.IsEmpty) or (FData.FieldByName('IsSel').AsInteger = 0) then
Result := False
else
procedure TUserRight.SetFunEnable(funid,uid,issel: Integer);
FData.SQL.Text := 'update UserRightData set IsSel='+IntToStr(issel)+
' where UserID='+IntToStr(uid)+' and FucID='+IntToStr(funid);
//這是現實權限管理界面的,也就是在上面設定使用者權限,這個大家可以根據自己的需要用不同的方式去展現
procedure TUserRight.ShowUserRigthView(uid: Integer);
var
frm: TfrmUserRightView;
frm := TfrmUserRightView.Create(nil);
try
frm.Caption := '使用者權限清單';
frm.SetUserRight(Self);
Self.GetRightListByUserID(uid);
frm.ShowModal;
finally
FreeAndNil(frm);
end.
看一下主窗體的調用
unit Main;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,UserRightCenter, StdCtrls, DB, ADODB;
TfrmMain = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Label1: TLabel;
ADOConnection1: TADOConnection;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
{ Private declarations }
FUserRight : TUserRight;
{ Public declarations }
frmMain: TfrmMain;
{$R *.dfm}
//現實使用者權限清單
procedure TfrmMain.Button1Click(Sender: TObject);
FUserRight.UserID := 1;
FUserRight.ShowUserRigthView(1);
procedure TfrmMain.FormCreate(Sender: TObject);
//ADOConnection1是你的資料庫連接配接
ADOConnection1.Open;
FUserRight := TUserRight.Create(ADOConnection1);
//建立使用者權限清單
procedure TfrmMain.Button2Click(Sender: TObject);
FUserRight.CreateRightListByUserID(StrToInt(Edit1.Text));
//測試,檢視權限,Button3的tag設定為10100003
procedure TfrmMain.Button3Click(Sender: TObject);
if FUserRight.IsRightEnable(1,IntToStr(TButton(Sender).Tag)) then
ShowMessage('可以使用')
ShowMessage('你沒有使用權限')
以上都是最基本的操作,沒有考慮更多的細節,大家可以根據需要填充。
本文轉自黃聰部落格園部落格,原文連結:http://www.cnblogs.com/huangcong/archive/2010/11/09/1872848.html如需轉載請自行聯系原作者