利用 BasePage 實作表單權限控管

利用 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

執行結果如下

image

ASP.NET 魔法學院