特別聲明:php
提供的源代碼已經包含了 AppBoxPro 的所有源代碼,用 VS2012 打開項目後,直接 Ctrl+F5 能夠運行起來(默認使用VS自帶的LocalDB數據庫)。html
FineUIPro是商業程序,僅包含v1.7.0公測版的DLL;固然你也能夠自行把 FineUIPro 換成 FineUI(開源版),開源版下載地址。數據庫
AppBoxPro 是基於 FineUIPro 和 Entity Framework 的通用權限管理框架,包括用戶管理、職稱管理、部門管理、角色管理、角色權限管理等模塊。架構
以前我曾經寫過文章介紹AppBox,不過主要集中在 EntityFramework的使用上:框架
今天,除了公開 AppBoxPro 的最新源代碼外,我主要介紹下若是作到將權限控制到表格行內按鈕。ide
AppBox中的權限管理涉及幾個概念:角色、用戶、權限、頁面測試
用一張圖來概述這個架構:ui
2.1 權限與頁面:以前咱們提到頁面擁有哪些權限,這個定義是在頁面代碼中的,而不是存在於數據庫中。spa
這就提供更大程序的靈活性,至關於每一個頁面均可以從整個站點的權限集合中選擇本身須要的權限。設計
好比,部門列表頁面(dept.aspx),咱們須要應用「部門瀏覽權限」,這個代碼是定義在 dept.aspx.cs 中的:
public partial class dept : PageBase { /// <summary> /// 本頁面的瀏覽權限,空字符串表示本頁面不授權限控制 /// </summary> public override string ViewPower { get { return "CoreDeptView"; } }
因爲「瀏覽權限」每一個頁面均可能會用到,因此咱們將處理「瀏覽權限」的代碼放在基類 PageBase.cs 中:
public class PageBase : System.Web.UI.Page { protected override void OnInit(EventArgs e) { base.OnInit(e); // 此用戶是否有訪問此頁面的權限 if (!CheckPowerView()) { CheckPowerFailWithPage(); return; }
在 CheckPowerView 中,則須要拿到當前登錄用戶所屬的角色,而後查找此角色是否擁有 「CoreDeptView」 權限的定義:
/// <summary> /// 檢查當前用戶是否擁有當前頁面的瀏覽權限 /// 頁面須要先定義ViewPower屬性,以肯定頁面與某個瀏覽權限的對應關係 /// </summary> /// <returns></returns> protected bool CheckPowerView() { return CheckPower(ViewPower); } /// <summary> /// 檢查當前用戶是否擁有某個權限 /// </summary> /// <param name="powerType"></param> /// <returns></returns> protected bool CheckPower(string powerName) { // 若是權限名爲空,則放行 if (String.IsNullOrEmpty(powerName)) { return true; } // 當前登錄用戶的權限列表 List<string> rolePowerNames = GetRolePowerNames(); if (rolePowerNames.Contains(powerName)) { return true; } return false; }
還要注意一點:兩個頁面可能須要用到同一個權限
而且這個權限出如今頁面中的邏輯會大相徑庭,好比「CoreDeptEdit」權限(編輯部門):
在dept.aspx頁面,用來控制表格行內按鈕的啓用禁用狀態:
protected void Grid1_PreDataBound(object sender, EventArgs e) { // 數據綁定以前,進行權限檢查 CheckPowerWithWindowField("CoreDeptEdit", Grid1, "editField"); CheckPowerWithLinkButtonField("CoreDeptDelete", Grid1, "deleteField"); }
在dept_edit.aspx頁面,用來控制對此頁面的瀏覽權限:
public partial class dept_edit : PageBase { public override string ViewPower { get { return "CoreDeptEdit"; } }
2.2 權限與角色:這個對應關係是定義在數據庫中的,相應的頁面操做界面以下所示。
通過上面的介紹,咱們對AppBox中的權限控制有個大體的瞭解。
下面,咱們經過一個小案例來介紹如何將權限控制到表格行內按鈕,仍是以「CoreDeptEdit」這個權限爲例。
3.1. 首先管理員(admin)登錄
3.2. 新建一個角色(測試角色)
3.3. 一個屬於本角色用戶(testuser)
3.4. 將 testuser 添加到測試角色
3.5. 爲測試角色設置權限(注意,「編輯部門」權限沒有選中)
3.6. 用新建立的用戶 testuser 登錄
3.7. 新用戶 testuser 沒有編輯部門的權限
關鍵代碼(更加詳細的實現,請自行下載所有源代碼):
在 dept.aspx.cs 中:
public partial class dept : PageBase { protected void Grid1_PreDataBound(object sender, EventArgs e) { // 數據綁定以前,進行權限檢查 CheckPowerWithWindowField("CoreDeptEdit", Grid1, "editField");
在 PageBase.cs 中:
public class PageBase : System.Web.UI.Page { protected void CheckPowerWithWindowField(string powerName, FineUIPro.Grid grid, string columnID) { if (!CheckPower(powerName)) { CheckPowerFailWithWindowField(grid, columnID); } } protected void CheckPowerFailWithWindowField(FineUIPro.Grid grid, string columnID) { FineUIPro.WindowField btn = grid.FindColumn(columnID) as FineUIPro.WindowField; btn.Enabled = false; btn.ToolTip = CHECK_POWER_FAIL_ACTION_MESSAGE; }
AppBox的權限控制很是靈活和簡單,而且提供細粒度到頁面上的每一個角落,不單單是頁面瀏覽、編輯、刪除、新增,甚至能夠是某個特定按鈕的啓用禁用、某個DIV的顯示隱藏、某個面板的摺疊展開,其實控制權就在你的手裏面。
若是本文對你有所啓發或者幫助,請點擊【推薦】按鈕,謝謝支持。