利用 BasePage 實作表單權限控管
摘要
若表單(頁面)具有「執行、新增、修改、刪除」等操作權限控管,可以使用列舉來描述使用者在該表單的權限,詳細的作法可以參考下面的「Enum 的設計與應用 - 簡易權限設計」這篇文章。在此我們將利用這種列舉的方式來描述表單權限,並由 BasePage 來處理表單權限的控管。
程式說明及實作
首先定義 EFormActions 列舉,來描述表單操作權限。
''' <summary>
''' 表單操作權限列舉。
''' </summary>
<Flags()> _
Public Enum EFormActions
''' <summary>
''' 無。
''' </summary>
None = 0
''' <summary>
''' 執行。
''' </summary>
Execute = 1
''' <summary>
''' 新增。
''' </summary>
Add = 2
''' <summary>
''' 修改。
''' </summary>
Update = 4
''' <summary>
''' 刪除。
''' </summary>
Delete = 8
''' <summary>
''' 全部。
''' </summary>
All = Execute Or Add Or Update Or Delete
End Enum
新增一個 TBActionPage 類別,繼承至 System.Web.UI.Page 或自訂的底層 BaseForm,做為權限控管的 BaseForm。首先新增一個 UserActions 屬性,來描述使用者的表單操作權限,在 OnInitComplete 方法中,第一次載入此表單時取得使用者的表單權限,即設定 UserActions 屬性,此屬性會儲存至 ViewState 中,使下次頁面 PostBack 時無需再重新取得表單權限。另外新增 CheckUserActions 方法,供檢查使用者是否具有指定的表單操作權限。
Public Class TBActionPage
Inherits System.Web.UI.Page
''' <summary>
''' 使用者權限。
''' </summary>
Private FUserActions As EFormActions = EFormActions.None
#Region " ViewState 狀態管理 "
''' <summary>
''' 由 ViewState 還原控制項的狀態。
''' </summary>
''' <param name="savedState">要還原的控制項狀態。</param>
Protected Overrides Sub LoadViewState(ByVal savedState As Object)
If Not (savedState Is Nothing) Then
' Load State from the array of objects that was saved at ;
' SavedViewState.
Dim myState As Object() = CType(savedState, Object())
If Not (myState(0) Is Nothing) Then
MyBase.LoadViewState(myState(0))
End If
If Not (myState(1) Is Nothing) Then
FUserActions = CType(myState(1), EFormActions)
End If
End If
End Sub
''' <summary>
''' 控制項的狀態儲存至 ViewState。
''' </summary>
''' <returns>含有控制項之目前檢視狀態的物件。</returns>
Protected Overrides Function SaveViewState() As Object
Dim baseState As Object = MyBase.SaveViewState()
Dim myState(1) As Object
myState(0) = baseState
myState(1) = FUserActions
Return myState
End Function
#End Region
''' <summary>
''' 覆寫。引發 InitComplete 事件。
''' </summary>
Protected Overrides Sub OnInitComplete(ByVal e As System.EventArgs)
If Not Me.IsPostBack Then
'取得使用者的表單權限
'測試用:設定使用者具「執行/新增/修改」權限,實際應呼叫中間層取得使用者的此表單權限
Me.UserActions = EFormActions.Execute Or EFormActions.Add Or EFormActions.Update
'第一次載入頁面時檢查執行權限
If Me.UserActions = EFormActions.None Then
Throw New Exception("沒有此表單執行權限")
End If
End If
MyBase.OnInitComplete(e)
End Sub
''' <summary>
''' 使用者的表單操作權限。
''' </summary>
Public Property UserActions() As EFormActions
Get
Return FUserActions
End Get
Set(ByVal value As EFormActions)
FUserActions = value
End Set
End Property
''' <summary>
''' 檢查使用者是否具有指定的表單操作權限。
''' </summary>
''' <param name="Actions">表單操作權限</param>
Public Function CheckUserActions(ByVal Actions As EFormActions) As Boolean
If (Me.UserActions And Actions) = Actions Then
Return True
Else
Return False
End If
End Function
End Class
測試程式
為測試使用,在上述的 TBActionPage 的 OnInitComplete 方法,直接設定具有「執行/新增/修改」權限;正確的作法應該是呼叫中間層傳入該表單的識別碼來取得使用者在該表單具有那些權限,並在此設定 UserActions 屬性值。
Me.UserActions = EFormActions.Execute Or EFormActions.Add Or EFormActions.Update
新增一個測試頁面,繼承至 TBActionPage,當按下按鈕時利用 CheckUserActions 使用者具那些權限並輸出。
Imports Bee.Web.WebCommon
Partial Class _Default
Inherits Bee.Web.TBActionPage
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.Response.Write("執行 -> " & IIf(Me.CheckUserActions(EFormActions.Execute), "Y", "N"))
Me.Response.Write("< br/ >")
Me.Response.Write("新增 -> " & IIf(Me.CheckUserActions(EFormActions.Add), "Y", "N"))
Me.Response.Write("< br/ >")
Me.Response.Write("修改 -> " & IIf(Me.CheckUserActions(EFormActions.Update), "Y", "N"))
Me.Response.Write("< br/ >")
Me.Response.Write("刪除 -> " & IIf(Me.CheckUserActions(EFormActions.Delete), "Y", "N"))
End Sub
End Class
執行結果如下