權限不管如何設計,縮小到原子級別,大體是這樣的:web
key-value,權限編碼--對應權限。c#
實現方式多種多樣。但在應用上,倒是一致的。即從權限集(一般緩存)中,根據權限的key,判斷是否有權限。緩存
有到頁面上,也有到頁面的具體功能上。函數
說一下道頁面級別的權限應用。網站
咱們的項目是這樣設計的。ui
表1(頁面權限編碼):編碼
functionId,urlurl
100001,Default.aspx設計
表2(用戶權限)繼承
functionid,userid
100001,1
分配權限時,記錄functionid.這樣就知道擁有的具體權限。
階段1、
在每個頁面上,假如權限判斷方法。沒有權限時,進行相應的處理。固然沒有權限的頁面不會在菜單中顯示的。
毫無疑問,工做量很大,幾乎每一個頁面都須要加入一樣的代碼。惟一不一樣的是不一樣頁面的key是不一樣的。
同時還有一個缺點,key容易寫錯。每每是複製,修改key。違反了DRY原則。
驗證權限方法:HasPermisstion(key)key:權限編碼
階段2、
因爲key很容易些錯,對方法進行了修改。頁面名稱做爲key,根據頁面名去判斷權限。而頁面名稱不須要做爲參數傳入,少了一個參數。
所以方法改成HasPermisstion()
在函數體內部,能夠經過HttpContext獲取頁面信息。
由階段一的100001做爲查找關鍵字,變爲default.aspx(請求頁面地址)
一樣每一個頁面都須要增長驗證方法!
階段3、
使用Ihttpmodule進行權限的控制。
因爲須要讀取Session,須要繼承接口System.Web.SessionState.IRequiresSessionState
在事件AcquireRequestState中進行權限判斷,調用HasPermisstion()方法。
克服了前兩個階段的缺點。開發這樣一個DLL,在web.config進行配置,便可使用。
想取消時,也很是簡單,直接在web.config中刪除相應的引用便可。不管怎麼更改,不須要從新發佈網站。
關於Ihttpmodule請查閱資料。
開發環境: c#2008