答應了客戶寫一個控制資料列的通路控制程式,雖然已經到了深夜1點多了,還是硬着頭皮把程式都調整好,文檔都寫好,明天客戶上班了,就可以看到例子程式了,希望能滿足客戶的實際需要。
其實權限的存儲,看透了,也是很簡單的事情,就是 “什麼對象對什麼資源有什麼權限?”把這個邏輯關系能儲存好就ok了,你這樣設計了,别人也容易閱讀你的程式,容易了解你的資料庫設計,将來也容易維護一些。
用一個思想,前後不沖突的,把整個系統實作出來,也有些不容易,很多環節會出現前後沖突,思路混亂的情況,是以時刻要提醒自己,自己的權限系統是按“什麼對象對什麼資源有什麼權限?”的指導思想設計的,若有違背了這個思想,那就仔細深入思考,再重新整理思路。
什麼對象:在系統裡确定各種對象的唯一性,需要2個參數,一個是對象的類别,一個是對象的主鍵,就像是ERP裡的入庫單(單号)。
什麼資源:什麼資源,也是一樣的,也需要一個分類,一個主鍵來識别資源的唯一性。
什麼權限:最簡單的做法,就是有一個權限表,隻用主鍵來識别唯一性,而不是用“哪個子產品+哪個功能”來識别權限,那樣做過于繁瑣了,将來的擴充性、可維護性都會很差一些,不能靈活适應各種複雜的情況。
那表格列的控制,也是一樣的道理,應該有一個權限定義,這個權限叫“表格列通路控制”,什麼對象是指使用者還是角色,對什麼資源是指各個表的列。
那有一個問題需要解決:這麼多表,都有哪些字段?若都靠人工輸入,那真的是搞死人,不準确不說,需要反複輸入,反複維護,除非有超級耐心,否則難做到準确性、高效性;解決問題的思路是:“我們不是設計了詳細的PowerDesigner資料模型嗎?不僅僅拿這個生成代碼,還可以生成資料表字段的說明文檔”
1:首先需要定義一個權限,這個權限叫“表格列通路控制”。
2:我們在PowerDesigner裡辛苦設計了表的結構,各個字段的注釋等,那先有設計後有實作的原理,資料庫裡都有什麼表、什麼字段,應該能從這個設計裡自動生成,而不是要人工再輸入資料。
3:那我們重複利用這個良好的設計,改進一下代碼生成,讓代碼生成器自動生成這些表的,字段說明。
4:那我們運作一下這些能自動經産生好表結構說明的程式,那我們就可以得到設定裡的内容了。
代碼
/// <summary>
/// 自動生成設定表字段
/// </summary>
private void SetTableColumns()
{
this.UserCenterDbHelper.Open();
BaseRoleManager roleManager = new BaseRoleManager(this.UserCenterDbHelper, this.UserInfo);
roleManager.SetTableColumns();
BaseUserManager userManager = new BaseUserManager(this.UserCenterDbHelper, this.UserInfo);
userManager.SetTableColumns();
BaseStaffManager staffManager = new BaseStaffManager(this.UserCenterDbHelper, this.UserInfo);
staffManager.SetTableColumns();
BaseModuleManager moduleManager = new BaseModuleManager(this.UserCenterDbHelper, this.UserInfo);
moduleManager.SetTableColumns();
this.UserCenterDbHelper.Close();
}
5:那運作好後,資料庫裡,就會有表結構的字段說明資料(這些都是代碼自動生成的,靠人工輸入會搞死人的,表結構有變化了,重新運作一次就OK了,省事了,徹底可以做到全自動化了,爽啊)。
6:在運作權限設定頁面,使用者、角色的字段通路權限可以進行設定了。
7:設定使用者的字段通路權限效果圖如下:
8:在沒控制表格列的通路控制時,運作效果如下:
9:按權限控制後,顯示出來的表格為,沒有允許通路的字段,不是公開的字段,就無法看到了,都被隐藏掉了:
10:資料列的權限控制代碼如下參考:
//------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd.
using System;
using System.Data;
using System.Web.UI.WebControls;
namespace DotNet.Web.Permission
{
using DotNet.Business;
using DotNet.Manager;
using DotNet.Utilities;
/// <remarks>
/// TableColumns
/// 表字段權限的例子
///
/// 修改紀錄
/// 版本:1.0 2010.07.13 JiRiGaLa 寫好例子程式友善别人學習。
///
/// 版本:1.0
/// <author>
/// <name>JiRiGaLa</name>
/// <date>2010.07.13</date>
/// </author>
/// </remarks>
public partial class TableColumns : BasePage
{
protected void Page_Load(object sender, EventArgs e)
// 當然是使用者需要登入,否則哪裡能知道,現在是判斷誰的權限啊?
this.UserInfo = Utilities.Login("[email protected]", String.Empty);
// 設定表字段
// this.SetTableColumns();
// 先設定表格的字段狀态
this.CheckUserTableColumnsPermission();
// 顯示使用者
this.GeUserList();
private void GeUserList()
// 擷取使用者清單
BaseUserManager userManager = new BaseUserManager();
DataTable dataTable = userManager.GetDT();
this.grvUser.DataSource = dataTable;
this.grvUser.DataBind();
private void CheckUserTableColumnsPermission()
// 目前使用者能通路那些字段?
BaseTableColumnsManager tableColumnsManager = new BaseTableColumnsManager(this.UserCenterDbHelper, UserInfo);
DataTable dataTable = tableColumnsManager.GetTableColumns(this.UserInfo.Id, "Base_User");
for (int i = 0; i < this.grvUser.Columns.Count; i++)
{
if (this.grvUser.Columns[i] is BoundField)
{
BoundField boundField = (BoundField)this.grvUser.Columns[i];
// 這個字段是否可以檢視?
boundField.Visible = BaseBusinessLogic.Exists(dataTable, BaseTableColumnsTable.FieldColumnCode, boundField.DataField);
}
}
}
}
本文轉自jirigala_bao 51CTO部落格,原文連結:http://blog.51cto.com/jirigala/806831