權(quán)限管理工具的使用
在當(dāng)今商業(yè)軟件的開(kāi)發(fā)中有一項(xiàng)功能是必不可少的 , 這就是權(quán)限工具 , 想必大家對(duì)權(quán)限這個(gè)詞不會(huì)太陌生 , 應(yīng)為在我們身邊的很多軟件上都用到了權(quán)限 , 比如說(shuō)最常見(jiàn)的 Windows 操作系統(tǒng),就使用到了權(quán)限,但是在實(shí)際的開(kāi)發(fā)過(guò)程中,權(quán)限是個(gè)相當(dāng)麻煩的東西。大家都在尋找一種簡(jiǎn)易的權(quán)限管理方式,這個(gè)時(shí)候我們發(fā)現(xiàn)了 CG . Security 這個(gè)組件,這是一個(gè)非常優(yōu)秀的功能權(quán)限管理組件,它可以讓我們非常簡(jiǎn)便的來(lái)控制軟件的權(quán)限。
使用 CG . Security 你可以任意添加刪除權(quán)限、角色和權(quán)限。可以通過(guò)大多數(shù)的權(quán)限管理方式給用戶(hù)賦予角色或直接給用戶(hù)賦予權(quán)限。
好了,簡(jiǎn)短介紹了 CG . Security 的功能后下面將為大家來(lái)講解下該組件的用法。在講解之前請(qǐng)首先到 http://www.codeproject.com/csharp/CGSecurity.asp 上下載該組件。
下面的講解會(huì)分兩個(gè)部分:
第一部分將講解該類(lèi)庫(kù)中常見(jiàn)的一些方法屬性的用法。第二部分通過(guò)一個(gè)小 DEMO ,給大家一個(gè)感性的認(rèn)識(shí),讓大家了解在實(shí)際開(kāi)發(fā)中如何使用 CG . Security 。
一、 類(lèi)庫(kù)的常用方法
在這個(gè)組件中用了六個(gè)類(lèi)來(lái)分別實(shí)現(xiàn)了用戶(hù)管理、權(quán)限管理和角色管理。
UserManager (用戶(hù)管理類(lèi)):該類(lèi)提供了添加、刪除和查找用戶(hù)的方法。
RoleManager (角色管理類(lèi)):該類(lèi)提供了添加、刪除和查找角色的方法。
RightManager (權(quán)限管理類(lèi)):該類(lèi)提供了添加、刪除和修改權(quán)限的方法。
UserRightManager (用戶(hù)權(quán)限管理類(lèi)):該類(lèi)的作用是使用戶(hù)和權(quán)限關(guān)聯(lián),也提供了增、刪、查的功能,使用此類(lèi),可以為某個(gè)用戶(hù)直接賦予權(quán)限。
UserRoleManager (用戶(hù)角色管理類(lèi)):該類(lèi)和上面的 UserRightManager 相似,也提供了相似的功能,所不同的是該類(lèi)是把用戶(hù)和角色進(jìn)行關(guān)聯(lián)。
RoleRightManager (角色權(quán)限管理類(lèi))該類(lèi)提供了角色和權(quán)限關(guān)聯(lián)的功能。
在介紹了上述六個(gè)類(lèi)后,下面還要為大家介紹在實(shí)際開(kāi)發(fā)中會(huì)用到的一個(gè)類(lèi)。
SecurityManager.cs 類(lèi),該類(lèi)提供了登陸驗(yàn)證( Authenticate )和獲得該用戶(hù)權(quán)限列表( EffectiveRights )的功能。使用該類(lèi)我們可以判斷用戶(hù)的合法性并且能得到當(dāng)前用戶(hù)的權(quán)限列表。
上面介紹了權(quán)限管理組件中幾個(gè)常見(jiàn)類(lèi)的功能。讓大家對(duì)權(quán)限管理組件有一個(gè)全面的了解,下面的一部分我將一步一步做出一個(gè)小 DEMO 讓大家對(duì)這個(gè)組件有一個(gè)感性的認(rèn)識(shí)。 OK ,偶們進(jìn)入下一環(huán)節(jié)吧。
二、 做一個(gè)小 Demo 來(lái)演示如何使用這個(gè)權(quán)限工具
一、 做一個(gè)小 Demo 來(lái)演示如何使用這個(gè)權(quán)限工具
1. 我們?cè)谶@個(gè) Demo 中會(huì)實(shí)現(xiàn)數(shù)據(jù)權(quán)限和功能權(quán)限兩種權(quán)限管理功能。首先我們要從網(wǎng)上下載該組件,該組件可以從 http://www.codeproject.com/csharp/CGSecurity.asp 上找到,在下載后在 bin/release 目錄下找到 CG.Security.dll 文件。
2 .新建一個(gè)解決方案 CG.SecurityTest 。
3 .然后在 Form1 上添加一個(gè) mainMenu, 然后在上面添家 4 個(gè)子項(xiàng),把他們分別命名為 mlTest1, mlTest2, mlTest3, mlTest4, 然后把他們的 Visible 設(shè)置為 false 。
4 .當(dāng)添加完菜單后我們還要添加一個(gè) dataGrid 和 3 個(gè)按鈕。
把 dataGrid 的 name 改為 dgView ; 3 個(gè)按鈕分別命名為 btnAllUser 、 btnTest1 和 btnView
然后把 btnTest1 的 Enabled 屬性設(shè)置為 false 。
5 .上面添加的是我們的主界面,下面我們還要添加一個(gè)用來(lái)輸入用戶(hù)名密碼等信息的輔助界面,在工程上添加一個(gè)新的 Windows 窗體,然后命名為 FormValue 。當(dāng)窗體新建好后在窗體上新建 textbox 、 button 一樣兩個(gè)。 textbox 分別命名為 txtName , txtPwd , button 分別命名為 btnOK , btnCancel 。并且把 btnOK 的 dialogresult 屬性設(shè)置為 OK , btnCancel 的 dialogresult 屬性設(shè)置為 Cancel 。窗體設(shè)置完后我們?cè)诖a中添加兩個(gè)屬性
public string UID
{
get { return txtName . Text . Trim();}
}
public string PWD
{
get { return txtPWD . Text . Trim();}
}
Ok 經(jīng)過(guò)上述三個(gè)步驟之后我們的界面工作就完成了,下面我們將開(kāi)始實(shí)現(xiàn)他們的具體功能 . 。
6 . 首先在項(xiàng)目種引用 CG.Security.dll 這個(gè)組件。在 FORM1 上導(dǎo)入 CG . Security 和 CG . Security . Principal 這兩個(gè)命名空間。
using CG . Security;
using CG . Security . Principal;
:)這一步是必不可少的。
7. 在添加完引用后。我們還有一個(gè)東西要準(zhǔn)備-配置文件,那么首先我們添加一個(gè)新的 App.Config ,然后 Copy 下列代碼到 App.Config 中:
<? xml version ="1.0" encoding ="utf-8" ?>
< configuration >
< configSections >
< sectionGroup name ="CG.Security.Data">
< section name ="runtimeSetup" type ="CG.Security.Data.Configuration.DataSettingsHandler, CG.Security" />
</ sectionGroup >
</ configSections >
< CG.Security.Data >
< runtimeSetup defaultSection ="Access">
< installedAssembly >
< add
sectionName ="Access"
targetAssembly ="CG.Security"
targetNamespace ="CG.Security.Data.Access"
connectionString ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\tempfile\CGSecurityDemo\bin\Debug\security.mdb"
/>
</ installedAssembly >
</ runtimeSetup >
</ CG.Security.Data >
</ configuration >
上述的配置文件大家可以看到是連接數(shù)據(jù)庫(kù)的一些信息,他使用到了 CG.Security.Data.Configuration.DataSettingsHandler 這個(gè)類(lèi)來(lái)讀取數(shù)據(jù)庫(kù)信息,在配置文件中我們可以很清楚的看到連接字符串,該配置文件使用 Oledb 連接到指定目錄下的 Access 數(shù)據(jù)庫(kù)。應(yīng)為我是放在 F 盤(pán)的,這里大家要根據(jù)自己數(shù)據(jù)庫(kù)存放的實(shí)際位置來(lái)。當(dāng)一切配置都完成了的時(shí)候,我們就開(kāi)始實(shí)現(xiàn)具體的代碼了。
8 .進(jìn)入應(yīng)用程序第一步肯定就是要驗(yàn)證當(dāng)前用戶(hù)的合法性啦, ok 那么我們首先從窗體的加載事件開(kāi)始講起:
首先我們要在定義一個(gè)全局的 string 數(shù)組 str 。
然后在 FormLoad 事件中添加如下的代碼。
// 實(shí)例化登陸窗體
FormValue fv = new FormValue();
if (fv . ShowDialog( this ) != DialogResult . OK)
{
this . Close();
return ;
}
// 驗(yàn)證用戶(hù)的 ID 和 Password
if ( ! SecurityManager . Authenticate(fv . UID,fv . PWD))
{
MessageBox . Show( " 用戶(hù)名或密碼不正確! " );
this . Close();
return ;
}
System . AppDomain . CurrentDomain . SetThreadPrincipal(
new CustomPrincipal( new CustomIdentity(fv . UID))
);
OleDbDataReader dataread = (OleDbDataReader)UserManager . FindByUserName(fv . UID);
dataread . Read();
str = SecurityManager . EffectiveRights(dataread . GetInt32( 0 ));
// 循環(huán)每個(gè)權(quán)限
foreach ( string strSingle in str)
{
switch (strSingle)
{
case "Test 1" :
miTest1 . Visible = true ;
btnTest1 . Enabled = true ;
break ;
case "Test 2" :
miTest2 . Visible = true ;
break ;
case "Test 3" :
miTest3 . Visible = true ;
break ;
case "Test 4" :
miTest4 . Visible = true ;
break ;
}
}
大家看到上述代碼就是一個(gè)權(quán)限管理的典型應(yīng)用,我將為大家一步一步講解這段代碼。
首先我們可以看到這樣一段代碼
FormValue fv = new FormValue();
if (fv . ShowDialog( this ) != DialogResult . OK)
{
this . Close();
return ;
}
該代碼是首先實(shí)例化一個(gè)輸入用戶(hù)名密碼的窗體,然后判斷用戶(hù)是否點(diǎn)擊了 OK ,如果用戶(hù)沒(méi)有點(diǎn)擊 OK 則退出程序。
if ( ! SecurityManager . Authenticate(fv . UID,fv . PWD))
{
MessageBox . Show( " 用戶(hù)名或密碼不正確! " );
this . Close();
return ;
}
這段代碼就是精華之所在了, SecurityManager 類(lèi)是一個(gè)驗(yàn)證類(lèi),在這里我們調(diào)用了它的 Authenticate 方法,該方法接受兩個(gè)參數(shù),用戶(hù)名和密碼。并返回一個(gè) BOOL 值,借此我們可以判斷該用戶(hù)的用戶(hù)名密碼是否正確。
System . AppDomain . CurrentDomain . SetThreadPrincipal(
new CustomPrincipal( new CustomIdentity(fv . UID))
);
該句的意思是把某一用戶(hù)綁定到線程的主對(duì)象上,在這里我們把當(dāng)前登陸的用戶(hù) ID 傳進(jìn)去,那么在整個(gè)程序中都可以知道當(dāng)前登陸的用戶(hù)。
OleDbDataReader dataread = (OleDbDataReader)UserManager . FindByUserName(fv . UID);
dataread . Read();
str = SecurityManager . EffectiveRights(dataread . GetInt32( 0 ));
上面一段代碼就是講如何使用權(quán)限了。首先我們調(diào)用 UserManager.FindByUserName 方法得到一個(gè) DataReader 對(duì)象(該方法是通過(guò)用戶(hù)名來(lái)查找用戶(hù)的信息),然后讀取 DataReader 對(duì)象取得當(dāng)前用戶(hù)的 ID 。
最后調(diào)用 SecurityManager . EffectiveRights 方法列出該用戶(hù)擁有的所有權(quán)限保存在一個(gè)字符串?dāng)?shù)組里面。
// 循環(huán)每個(gè)權(quán)限
foreach ( string strSingle in str)
{
switch (strSingle)
{
case "Test 1" :
miTest1 . Visible = true ;
btnTest1 . Enabled = true ;
break ;
case "Test 2" :
miTest2 . Visible = true ;
break ;
case "Test 3" :
miTest3 . Visible = true ;
break ;
case "Test 4" :
miTest4 . Visible = true ;
break ;
}
}
在這里我們剛才得到的權(quán)限數(shù)組,然后在判斷當(dāng)該用戶(hù)是否擁有某個(gè)功能權(quán)限,例如 Test 1 權(quán)限的時(shí)候就讓他使用 Test1 菜單和 btnTest1 按鈕等。
這個(gè)時(shí)候大家可以編譯程序,拿 admin 用戶(hù)進(jìn)系統(tǒng)和拿 user 進(jìn)系統(tǒng)有什么不同之處呢?呵呵,大家可以看大使用 User 進(jìn)去的時(shí)候菜單 Test1 和 Test4 不見(jiàn)了,還有就是 btnTest1 按鈕變成灰色的了。
9. 上面,我們講述了怎么使用功能權(quán)限,接下來(lái),我將利用一個(gè)主從表的示例程序來(lái)為大家講解如何使用數(shù)據(jù)權(quán)限,我們最后要實(shí)現(xiàn)的效果是擁有 Test4 權(quán)限的用戶(hù)可以即看到主表又看到從表,反之則只能看到主表。
好了,首先我們?cè)? bin/debug 目錄下添加一個(gè) orders.mdb 數(shù)據(jù)庫(kù),然后在里面分別建 2 張表 orders 和 orderlist 。
Orders 表字段如下
ordered 自動(dòng)編號(hào)
orderType 文本 (訂單類(lèi)別)
orderTimer 日期時(shí)間 (發(fā)生時(shí)間)
orderlist 表字段如下
orderListID 自動(dòng)編號(hào)
orderid 數(shù)字 (主表的 ID )
ProdName 文本 (商品名稱(chēng))
Count 數(shù)字 (數(shù)量)
當(dāng)大家把上面的表格式建立好了以后把 orders 和 orderlist 表的 orderid 值進(jìn)行關(guān)聯(lián)。
上述步驟做完了后就往數(shù)據(jù)庫(kù)里面添加幾條數(shù)據(jù)。
OK 數(shù)據(jù)庫(kù)準(zhǔn)備好了,我們也該看看怎么來(lái)實(shí)現(xiàn)了,在 btnView 的 click 事件中添加如下的代碼:
OleDbConnection con = new OleDbConnection( @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=orders.mdb" );
con . Open();
OleDbDataAdapter da = new OleDbDataAdapter( "select * from orders" ,con);
DataSet ds = new DataSet();
da . Fill(ds, "<place w:st="on">Main</place>" );
dgView . DataSource = ds . Tables[ 0 ];
dgView . TableStyles . Clear();
DataGridTableStyle dts = new DataGridTableStyle();
DataGridTextBoxColumn dcstype = new DataGridTextBoxColumn();
DataGridTextBoxColumn dcsName = new DataGridTextBoxColumn();
dcstype . MappingName = "orderType" ;
dcstype . HeaderText = " 類(lèi)型 " ;
dcsName . MappingName = "orderTimer" ;
dcsName . HeaderText = " 時(shí)間 " ;
dts . GridColumnStyles . Add(dcstype);
dts . GridColumnStyles . Add(dcsName);
dts . MappingName = ds . Tables[ 0 ] . TableName;
dgView . TableStyles . Add(dts);
foreach ( string stra in str)
{
// 如果當(dāng)用戶(hù)擁有該權(quán)限的時(shí)候可以看到從表里面的內(nèi)容
if (stra == "Test 4" )
{
OleDbDataAdapter daList = new OleDbDataAdapter( "select * from orderList where orderid in(select orderid from orders)" ,con);
daList . Fill(ds, "List" );
ds . Relations . Add(ds . Tables[ 0 ] . Columns[ "orderid" ],ds . Tables[ 1 ] . Columns[ "orderid" ]);
DataGridTableStyle dtL = new DataGridTableStyle();
DataGridTextBoxColumn dclName = new DataGridTextBoxColumn();
DataGridTextBoxColumn dclCount = new DataGridTextBoxColumn();
dclName . MappingName = "prodName" ;
dclName . HeaderText = " 商品名 " ;
dclCount . MappingName = "count" ;
dclCount . HeaderText = " 數(shù)量 " ;
dtL . GridColumnStyles . Add(dclName);
dtL . GridColumnStyles . Add(dclCount);
dtL . MappingName = ds . Tables[ 1 ] . TableName;
dgView . TableStyles . Add(dtL);
break ;
}
}
上面的代碼很簡(jiǎn)單,都是常用的數(shù)據(jù)庫(kù)操作,我要講解的是便利循環(huán)的地方。
foreach ( string stra in str)
{
// 如果當(dāng)用戶(hù)擁有該權(quán)限的時(shí)候可以看到從表里面的內(nèi)容
if (stra == "Test 4" )
{
OleDbDataAdapter daList = new OleDbDataAdapter( "select * from orderList where orderid in(select orderid from orders)" ,con);
daList . Fill(ds, "List" );
ds . Relations . Add(ds . Tables[ 0 ] . Columns[ "orderid" ],ds . Tables[ 1 ] . Columns[ "orderid" ]);
……
}
<span
- 2005-03-20 09:24
- 瀏覽 213
- 評(píng)論(0)
- 相關(guān)推薦
發(fā)表評(píng)論
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

評(píng)論