標籤:json 簡單 admin 基類 class rect 定義 account 加密
許可權管理,一般指根據系統設定的安全規則或者安全性原則,使用者可以訪問而且只能訪問自己被授權的資源,不多不少。許可權管理幾乎出現在任何系統裡面,只要有使用者和密碼的系統。許可權管理還是比較複雜的,有的固定到某個模組,某個操作,甚至是某個按鈕,總之想要做好一個許可權管理,真的很不容易,一直在探索當中,全當拋磚引玉;看到網上好多關於許可權管理的文章,以前也寫過簡單的文章,今天樓主我也要總結整理一下自己的實現方法,畢竟一千個讀者就有一千個哈姆雷特,說說自己的詳細實現、基本設計和基本思想希望幫到入門的新人們。
一、基本的資料庫表設計
基本的表設計,使用者表、角色表、模組表、許可權表和使用者角色關係表、角色模組許可權關係表,某個使用者的角色(管理員、使用者等),然後再去判斷對應角色的模組(新聞、文章等)許可權(增、刪、改、查)。
建立基本許可權操作的SQL指令碼:
1234567891011121314151617181920212223242526272829303132333435363738 |
CREATE TABLE [dbo].[Module]( [ID] [ int ] IDENTITY(1,1) PRIMARY KEY NOT NULL , [ModuleKey] [nvarchar](100) NOT NULL , [ModuleName] [nvarchar](100) NOT NULL , ) CREATE TABLE [dbo].[Permission]( [ID] [ int ] IDENTITY(1,1) PRIMARY KEY NOT NULL , [PermissionKey] [nvarchar](100) NOT NULL , [PermissionName] [nvarchar](100) NOT NULL , ) CREATE TABLE [dbo].[Role]( [ID] [ int ] IDENTITY(1,1) PRIMARY KEY NOT NULL , [RoleName] [nvarchar](100) NOT NULL , ) CREATE TABLE [dbo].[RoleModulePermission]( [ID] [ int ] IDENTITY(1,1) PRIMARY KEY NOT NULL , [RoleID] [ int ] NOT NULL , [ModuleID] [ int ] NOT NULL , [PermissionID] [ int ] NOT NULL , ) CREATE TABLE [dbo].[ User ]( [ID] [ int ] IDENTITY(1,1) PRIMARY KEY NOT NULL , [AccountNum] [nvarchar](100) NOT NULL , [Pwd] [nvarchar](100) NOT NULL , [Status] [ int ] NOT NULL , [LastLoginTime] [datetime] NOT NULL , [Remark] [nvarchar](100) NULL , ) CREATE TABLE [dbo].[UserRole]( [ID] [ int ] IDENTITY(1,1) PRIMARY KEY NOT NULL , [UserID] [ int ] NOT NULL , [RoleID] [ int ] NOT NULL , ) |
二、代碼中具體的實現
這是一個基類,所有的Controller都繼承BaseController,[UserAuthorizeFilter(Order = 999)],每一個Action過濾器都有一個 Order 屬性,用來決定Action過濾器在該範圍內的執行順序。Order屬性必需是0(預設值)或者更大的整數值。省略Order屬性則會給該過濾器的Order值為 -1, 表明為指明順序。任何一個在同一範圍的Action過濾器Order設為 -1 的都將按不確定的順序執行,單在此之前過濾器有一個特定的順序。登入的時候是儲存的加密的Cookie,會有一個私密金鑰(自己定義)。
[UserAuthorizeFilter(Order = 999)] public class BaseController : Controller { public int LoginID { get; set; } public string LoginName { get; set; } /// <summary> /// 是否登入的標誌 /// </summary> /// <returns></returns> public bool IsLogin() { if (NCookieUtil.GetCookie("GkqCMSCookie") != null) { string cookie_ver = NCookieUtil.GetCookie("GkqCMSCookie"); string[] cookieArray = cookie_ver.Split(‘&‘); int loginId = cookieArray[1].ToInt(); string token = cookieArray[0].ObjectToString(); Admin_User user = AdminPermissionRepository.Get(loginId); if (user != null) { string tokenKey = string.Format("{0}{1}{2}{3}", user.ID.ObjectToString(), user.AccountNum.ObjectToString(), user.Pwd.ObjectToString(), CommonHelper.SecretSalt); if (token == tokenKey) { LoginID = user.ID; LoginName = user.AccountNum; return true; } return false; } return false; } else { return false; } } }
Filter裡面判斷使用者是否登入cb.IsLogin(),如果登陸驗證通過還要驗證是否對某個某個Controller對應的Action有操作許可權。如果未登入或者發成錯誤底層會捕獲,跳轉到登陸頁面或者是錯誤頁。
public class UserAuthorizeFilter : System.Web.Mvc.AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { BaseController cb = filterContext.Controller as BaseController; if (!cb.IsLogin()) { SetHttpContext(filterContext, GkmBBS.DataCenter.GlobalEnumHelper.EnumJsonResult.NotLogin, "未登入"); } else { bool IsAuthorization = filterContext.Controller.TempData["IsAuthorization"].ToBoolean(true); if (IsAuthorization) { string controller = filterContext.RouteData.Values["controller"].ObjectToString(); string action = filterContext.RouteData.Values["action"].ObjectToString(); if (!AdminPermissionRepository.IsPowerPage(cb.LoginID,controller, action)) { SetHttpContext(filterContext, GkmBBS.DataCenter.GlobalEnumHelper.EnumJsonResult.NoAccess, "您沒有許可權執行此操作"); } } } } private void SetHttpContext(AuthorizationContext filterContext, GkmBBS.DataCenter.GlobalEnumHelper.EnumJsonResult result, string msg) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { var data = new { Result = (int)result, Msg = msg }; filterContext.Result = new JsonpResult() { Data = data, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } else { if (result == GkmBBS.DataCenter.GlobalEnumHelper.EnumJsonResult.NotLogin) { filterContext.Result = new RedirectResult(string.Format("/Login/Index?ReturnUrl={0}", filterContext.HttpContext.Request.Url.OriginalString)); } else { filterContext.Controller.ViewData["ErrorMessage"] = msg; filterContext.Result = new ViewResult() { ViewName = "Error", ViewData = filterContext.Controller.ViewData }; } } } }
使用者的ID判斷角色,然後把角色去查是否有這個許可權,如果有進入,對應的controller 和action,如果沒有則沒許可權。具體實現方法如下:
public static bool IsPowerPage(int loginID, string Moudle, string operate) { try { string sql = string.Format(@"SELECT COUNT(1)FROM ( SELECT c.modulekey, d.permissionkey FROM ( SELECT * FROM Admin_userrole WHERE userid = {0} ) a LEFT JOIN Admin_RoleModulePermission b ON a.roleId = b.roleId LEFT JOIN Admin_Module c ON b.moduleId = c.Id LEFT JOIN Admin_Permission d ON b.PermissionId = d.Id ) eWHERE e.moduleKey = ‘{1}‘ AND e.PermissionKey = ‘{2}‘", loginID, Moudle, operate); return NSqlHelper.ExecuteScalar(NWebConfig.ReadConnectionString(DBCon.SYS_DBCONNSTRING), CommandType.Text, sql, null).ToInt() > 0; } catch (Exception ex) { log.Error("AdminPermissionRepository-IsPowerPage", ex); return false; } }
使用者登入成功寫入Cookie,然後瀏覽每個模組判斷登入和具體某個模組的許可權, 這算是一個最基本簡單許可權管理,適合新手入門用,大牛們覺的不合適的地方,或者更好的方法多多指導!
MVC中許可權管理