網(wǎng)站建設(shè)中,會(huì)碰到最常用的用戶管理及操作權(quán)限設(shè)置驗(yàn)證,雖然這是很常見(jiàn)的一個(gè)管理操作,但要做得完善很不容易。最近參考了許多.net方面的書,特別關(guān)心這方面的,并結(jié)合自己特點(diǎn),摸索了一下適合自己的用戶管理方法,完成了基本管理類庫(kù)。
  
  用戶的管理方法,在設(shè)計(jì)時(shí)采取“用戶——角色——許可”三級(jí),這是windows操作系統(tǒng)的用戶管理方法。一個(gè)用戶可以有多個(gè)角色,一個(gè)角色也可以有多個(gè)許可。
  
  所以有數(shù)據(jù)庫(kù)設(shè)計(jì)時(shí)分別設(shè)計(jì):
  
  用戶表:設(shè)userid、用戶名、用戶信息
  角色表:設(shè)roleid、categoryid、rolename、description
  用戶角色表:userid、roleid
  
  分類表:categoryid、categoryname、description
  許可表:permissionid、categoryid、permissionname、description
  角色許可表:roleid、permissionid
  
  設(shè)計(jì)好數(shù)據(jù)庫(kù)后,即可以從事設(shè)計(jì)用戶、角色、許可的類。類庫(kù)分?jǐn)?shù)據(jù)層類,完成建立、查詢、刪除、更新等操作。業(yè)務(wù)層的類,需要實(shí)現(xiàn)與數(shù)據(jù)無(wú)關(guān)功能,建立如用戶擁有角色、許可的列表,驗(yàn)證方式等。
  
  在業(yè)務(wù)層有一很重要的方法,即是用.net的驗(yàn)證方式來(lái)實(shí)現(xiàn),因此建立二個(gè)類:
  
  一是 siteidentity 類,它繼承自業(yè)務(wù)層基類,并采用system.security.principal.iidentity接口。該類主要存放用戶的基本信息,包括用戶名、email及id號(hào)、密碼。它的方法較簡(jiǎn)單,通過(guò)驗(yàn)證后,把用戶的基本信息。
  
  二是 helloseaprincipal 類,它也繼承業(yè)務(wù)基類,采用system.security.principal.iprincipal接口。該類的主要方法有驗(yàn)證類,并把驗(yàn)證后的用戶信息、用戶角色列表、許可列表存儲(chǔ)到類中。該類中有二個(gè)方法和一個(gè)property是iidentity接口必須的,即isinrole、haspermission,和system.security.principal.iidentity identity。
  
  設(shè)計(jì)完成類庫(kù)后,即可以用來(lái)驗(yàn)證用戶了。比如在管理登錄頁(yè)面中,需要判斷用戶的密碼是否正確,并判斷用戶是否有許可進(jìn)入管理頁(yè)面。
  
  下面是驗(yàn)證中的一段:
  
  helloseaprincipal admin = helloseaprincipal.validatelogin(txtadminname.text,                                   txtpassword.text);
if (admin == null) {
labinfo.text = "沒(méi)有該管理員帳號(hào),或輸入密碼不正確。";
} else if ( !admin.haspermission(1) ) {
labinfo.text = "您并不是管理角色并且沒(méi)有管理許可,不能進(jìn)入本系統(tǒng)。";
} else {
context.user = admin;
formsauthentication.setauthcookie(txtadminname.text, true);
response.redirect("adminindex.aspx");
}
  注:!admin.haspermission(1)的1是數(shù)據(jù)庫(kù)中許可的id號(hào)
  
  在內(nèi)部頁(yè)面中可以用:
  
  helloseaprincipal currentprincipal = (helloseaprincipal)context.user;
if (!currentprincipal.haspermission(1)) {
      }
  這樣方法來(lái)驗(yàn)證用戶,雖然它也是通過(guò)cookie,但.net中的cookie是加密的,能實(shí)現(xiàn)很高的安全性
  這樣的設(shè)計(jì)還有個(gè)缺點(diǎn),即是許可的id號(hào)是固定值。考慮到一般的管理頁(yè)面需要的許可比較固定,所以采用把許可設(shè)置在config文件中。而一些頻道等需要經(jīng)常變化的驗(yàn)證許可放置在數(shù)據(jù)庫(kù)的頻道表中。下面是我采用的config文件中設(shè)置方法實(shí)現(xiàn),不詳細(xì)介紹如何讀取和寫入了。從config文件讀取和寫入可采用xml串行化和反串行化很容易實(shí)現(xiàn),可以用類來(lái)封裝,并且在使用時(shí)非常方便,下面的語(yǔ)句即是通過(guò)封裝類中讀取許可的方法:
  
  if ( !admin.haspermission(operatepermissionconfig.getsettings().managerlogin) ){}
  關(guān)于權(quán)限和驗(yàn)證,就介紹到這里,只能簡(jiǎn)單介紹了。因?qū)崿F(xiàn)的代碼非常長(zhǎng),所以這里只是介紹一種思維方式,具體實(shí)現(xiàn)每個(gè)人都會(huì)有自己特點(diǎn)。 
| 
 
 | 
新聞熱點(diǎn)
疑難解答
圖片精選