使用者管理及操作許可權設定驗證寫出新思路

weixin_34344677發表於2007-12-10
網站建設中,會碰到最常用的使用者管理及操作許可權設定驗證,雖然這是很常見的一個管理操作,但要做得完善很不容易。最近參考了許多.NET方面的書,特別關心這方面的,並結合自己特點,摸索了一下適合自己的使用者管理方法,完成了基本管理類庫。
  
  使用者的管理方法,在設計時採取“使用者——角色——許可”三級,這是WINDOWS作業系統的使用者管理方法。一個使用者可以有多個角色,一個角色也可以有多個許可。
  
  所以有資料庫設計時分別設計:
  
  使用者表:設UserID、使用者名稱、使用者資訊
  角色表:設RoleID、CategoryID、RoleName、Description
  使用者角色表:UserID、RoleID
  
  分類表:CategoryID、CategoryName、Description
  許可表:PermissionID、CategoryID、PermissionName、Description
  角色許可表:RoleID、PermissionID
  
  設計好資料庫後,即可以從事設計使用者、角色、許可的類。類庫分資料層類,完成建立、查詢、刪除、更新等操作。業務層的類,需要實現與資料無關功能,建立如使用者擁有角色、許可的列表,驗證方式等。
  
  在業務層有一很重要的方法,即是用.NET的驗證方式來實現,因此建立二個類:
  
  一是 SiteIdentity 類,它繼承自業務層基類,並採用System.Security.Principal.IIdentity介面。該類主要存放使用者的基本資訊,包括使用者名稱、EMAIL及ID號、密碼。它的方法較簡單,通過驗證後,把使用者的基本資訊。
  
  二是 HelloseaPrincipal 類,它也繼承業務基類,採用System.Security.Principal.IPrincipal介面。該類的主要方法有驗證類,並把驗證後的使用者資訊、使用者角色列表、許可列表儲存到類中。該類中有二個方法和一個Property是IIdentity介面必須的,即IsInRole、HasPermission,和System.Security.Principal.IIdentity Identity。
  
  設計完成類庫後,即可以用來驗證使用者了。比如在管理登入頁面中,需要判斷使用者的密碼是否正確,並判斷使用者是否有許可進入管理頁面。
  
  下面是驗證中的一段:
  
  HelloseaPrincipal admin = HelloseaPrincipal.ValidateLogin(txtAdminName.Text,                                   txtPassword.Text);      if (admin == null)      {        labInfo.Text = "沒有該管理員帳號,或輸入密碼不正確。";      }      else if ( !admin.HasPermission(1) )      {        labInfo.Text = "您並不是管理角色並且沒有管理許可,不能進入本系統。";      }      else      {        Context.User = admin;        FormsAuthentication.SetAuthCookie(txtAdminName.Text, true);        Response.Redirect("AdminIndex.aspx");      }
  注:!admin.HasPermission(1)的1是資料庫中許可的ID號
  
  在內部頁面中可以用:
  
  HelloseaPrincipal currentPrincipal = (HelloseaPrincipal)Context.User;      if (!currentPrincipal.HasPermission(1))      {      }
  這樣方法來驗證使用者,雖然它也是通過Cookie,但.net中的Cookie是加密的,能實現很高的安全性。
  
  這樣的設計還有個缺點,即是許可的ID號是固定值。考慮到一般的管理頁面需要的許可比較固定,所以採用把許可設定在config檔案中。而一些頻道等需要經常變化的驗證許可放置在資料庫的頻道表中。下面是我採用的config檔案中設定方法實現,不詳細介紹如何讀取和寫入了。從config檔案讀取和寫入可採用XML序列化和反序列化很容易實現,可以用類來封裝,並且在使用時非常方便,下面的語句即是通過封裝類中讀取許可的方法:
  
  if ( !admin.HasPermission(OperatePermissionConfig.GetSettings().ManagerLogin) ){}
  關於許可權和驗證,就介紹到這裡,只能簡單介紹了。因實現的程式碼非常長,所以這裡只是介紹一種思維方式,具體實現每個人都會有自己特點。

相關文章