0

ユーザーのアクセス許可に基づいて、他の Web コントロールを拡張し、visible や enabled などのプロパティを設定できるコントロールを作成しようとしています。

ユーザー ロールに「CanSave」権限を含める必要がある例を次に示します。

<asp:Button ID="btn1" runat="server" Text="Save"/>
<myControls:PermissionsExtender runat="server" ControlToSet="btn1" Permission="CanSave"/>

私はこれを再利用できるようにしようとしています。そのため、PermissionExtender は別のプロジェクトにあり、他のプロジェクトに依存することはできません。決定を下すには、もちろん、コントロールはこの情報をどこか (データベースなど) から取得する必要があります。私は別のコントロールを作成し、イベントを使用して、上記のエクステンダーはマスター コントロールによって設定されるため、情報を検索する場所を知る必要があるのはそれだけです。

マスター コントロールは、ロールとアクセス許可に関する情報がどこから来るのかを知るように構成する必要があります。私の考えは、再利用可能なプロジェクト内にインターフェースを持ち、それを別の場所に実装してから、必要なメソッドを実装するクラスを見つけてリフレクションを介してロードするようにコントロールを構成することでした。しかし、これがどのように機能するかは不明です。おそらくマスター コントロールをマスター ページに配置し、PermissionClass="SecurityLibrary.PermissionsClass" のようなクラス名を指定します。ObjectDatasource のようなものですが、他の提案は大歓迎です。

メソッドのシグネチャは次のようになります。 bool HasPermission(string permission) 現在のユーザーの役割を認識し、その組み合わせを使用して、役割に権限が含まれているかどうかを調べます。

コントロールから、必要な情報を依存せずに提供できるメイン プロジェクト内のメソッドへの呼び出しを接続するにはどうすればよいですか。

4

1 に答える 1

1

私はあなたのために働くものを持っていると思います(私にとってはうまくテストされましたが、あなたが探していたものの一部を誤解しているかもしれません)。この実装では、asp.net デザイナー コードは次のようになります。

    <web:PermissionMasterControl runat="server" ID="masterController" PermissionClass="SecurityLibrary.RandomPermissionClass" />

    <asp:Button ID="btnSave" runat="server" Text="save" />
    <web:PermissionExtender runat="server" ControlToSet="btnSave" Permission="CanSave" MasterControllerID="masterController" />

次に、SecurityLibrary について説明します。簡単に言うと、ランダムに true/false を返す単純な「RandomPermissionClass」を含めました。

Namespace SecurityLibrary
    Public MustInherit Class PermissionClass
        Public MustOverride Function HasPermission(ByVal permission As String) As Boolean
    End Class

    Public Class RandomPermissionClass
        Inherits PermissionClass

        Private rand As New Random()

        Public Overrides Function HasPermission(permission As String) As Boolean
            Return If(rand.Next(2) = 0, False, True)
        End Function
    End Class
End Namespace

これで、SecurityLibrary への参照を含まない "myControls" ライブラリができました。2 つのコントロールとデリゲートを作成しました。コントロールは「PermissionMasterControl」と「PermissionExtender」です。デリゲートは、反映されたオブジェクトに対して実際にチェックを実行するために使用されるものです。

Namespace myControls
    Public Delegate Function HasPermissionDelegate(ByVal permission As String) As Boolean

    Public Class PermissionMasterControl
        Inherits System.Web.UI.Control

        Public Property PermissionClass As String
            Get
                Return If(ViewState("PermissionClass") Is Nothing, "", ViewState("PermissionClass").ToString())
            End Get
            Set(value As String)
                ViewState("PermissionClass") = value
            End Set
        End Property

        Private ReadOnly Property PermissionDelegate As HasPermissionDelegate
            Get
                If _permissionDel Is Nothing Then
                    If Not String.IsNullOrEmpty(PermissionClass) Then
                        Dim t = Type.GetType(PermissionClass, False)

                        If t IsNot Nothing Then
                            _permissionObj = Activator.CreateInstance(t)

                            Dim mi As MethodInfo = _
                                    t.GetMethod("HasPermission", BindingFlags.Public Or BindingFlags.Instance)

                            _permissionDel = [Delegate].CreateDelegate(GetType(HasPermissionDelegate), _permissionObj, mi)

                        End If
                    End If
                End If

                Return _permissionDel
            End Get
        End Property

        Private _permissionObj As Object = Nothing
        Private _permissionDel As HasPermissionDelegate = Nothing

        Public Function HasPermission(ByVal permission As String) As Boolean
            If PermissionDelegate Is Nothing Then
                Throw New NullReferenceException("The specified permission class (" + PermissionClass + ") could not be loaded/found.")
            End If

            Return PermissionDelegate(permission)
        End Function
    End Class

    Public Class PermissionExtender
        Inherits System.Web.UI.Control

        Public Property ControlToSet As String
            Get
                Return If(ViewState("ControlToSet") Is Nothing, "", ViewState("ControlToSet").ToString())
            End Get
            Set(value As String)
                ViewState("ControlToSet") = value
            End Set
        End Property

        Public Property Permission As String
            Get
                Return If(ViewState("Permission") Is Nothing, "", ViewState("Permission").ToString())
            End Get
            Set(value As String)
                ViewState("Permission") = value
            End Set
        End Property

        Public Property MasterControllerID As String
            Get
                Return If(ViewState("MasterControllerID") Is Nothing, "", ViewState("MasterControllerID").ToString())
            End Get
            Set(value As String)
                ViewState("MasterControllerID") = value
            End Set
        End Property

        Protected ReadOnly Property MasterController As PermissionMasterControl
            Get
                If _mastercontroller Is Nothing Then
                    _mastercontroller = Me.Page.FindControl(MasterControllerID)
                End If

                Return _mastercontroller
            End Get
        End Property

        Protected ReadOnly Property ManagedControl As Control
            Get
                If _controlToSet Is Nothing Then
                    _controlToSet = Me.NamingContainer.FindControl(ControlToSet)
                End If

                Return _controlToSet
            End Get
        End Property

        Private _controlToSet As Control = Nothing
        Private _mastercontroller As PermissionMasterControl = Nothing


        Protected Overrides Sub OnLoad(e As System.EventArgs)
            MyBase.OnLoad(e)

            Dim bResult As Boolean = MasterController.HasPermission(Permission)

            ManagedControl.Visible = bResult
        End Sub
    End Class
End Namespace
于 2011-06-22T14:20:03.043 に答える