• C/S应用程序权限设计(2)


    上一篇中,简单的说了一下,如何从窗体中获取所有的权限对象(我一般都称为权限实体),对于数据库开发而言,比较多的都是判断,当前用户是否有添加,查看,编辑,删除的权限.当然还有其它扩展的,如审核之类的.

    下面就来说说权限实体 Lily.ComponentFramework.PermissionBase 要实现,我这样的权限管理,并不需要按我的权限实体来设计,当然你的系统必须要采用类似于ORM的东西或是有把表映射为对象的东西.Lily.ComponentFramework.PermissionBase就是从已有的实体对象继承而来的(我系统的ORM是一个轻量经的)

    首先来看看,添加,查看,编辑,删除权限的实现

      ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否是添加的权限.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-21    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HasAdd() As Boolean
            
    Get
                
    Return Me.Has("添加")
            
    End Get
        
    End Property

        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否有删除的权限.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-21    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HasDelete() As Boolean
            
    Get
                
    Return Me.Has("删除")
            
    End Get
        
    End Property

        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否有更改的权限.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-21    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HasModify() As Boolean
            
    Get
                
    Return Me.Has("修改")
            
    End Get
        
    End Property

        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否是有查看的权限.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-21    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HasLook() As Boolean
            
    Get
                
    Return Me.Has("查看")
            
    End Get
        
    End Property

        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否有执行某项操作的权限.
        
    ''' </summary>
        
    ''' <param name="strDo">操作</param>
        
    ''' <returns></returns>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-25    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable Function Has(ByVal strDo As StringAs Boolean
            
    If strDo Is Nothing OrElse strDo.Length = 0 Then
                
    Return True
            
    Else
                
    If Not ComponentManager.Permission Is Nothing Then
                    
    Return ComponentManager.Permission.Has(Me, strDo)
                
    Else
                    
    Return True
                
    End If
            
    End If
        
    End Function

    上面就是这个实体内置的几个权限判断方面的方法,其实最重要的就是Has方法,这里是通过另一个类进行权限判断的,实现细节,到以后的章节介绍.比如:我一个订单表,对应了一个实体对象,并且继承于PermissionBase.如果需要增加一个对订单批准的权限只需增加一个方法HasApprove 代码可以简单为 return has("批准") 即可.

    下面来看一下,此对象的完整实现

    ''' -----------------------------------------------------------------------------
    ''' Project     : Lily.ComponentFramework
    ''' Class     : ComponentFramework.PermissionBase
    ''' 
    ''' -----------------------------------------------------------------------------
    ''' <summary>
    ''' 权限实体基类.
    ''' </summary>
    ''' <remarks>
    ''' </remarks>
    ''' <history>
    '''     [zqonline]    2007-03-28    Created
    ''' </history>
    ''' -----------------------------------------------------------------------------
    Public MustInherit Class PermissionBase
        
    Inherits EntityBase

    #Region "类实例化"
        
    Public Sub New()
            
    MyBase.New()
        
    End Sub
    #End Region

    #Region "访问控制"
        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否是添加的权限.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-21    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HasAdd() As Boolean
            
    Get
                
    Return Me.Has("添加")
            
    End Get
        
    End Property

        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否有删除的权限.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-21    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HasDelete() As Boolean
            
    Get
                
    Return Me.Has("删除")
            
    End Get
        
    End Property

        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否有更改的权限.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-21    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HasModify() As Boolean
            
    Get
                
    Return Me.Has("修改")
            
    End Get
        
    End Property

        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否是有查看的权限.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-21    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HasLook() As Boolean
            
    Get
                
    Return Me.Has("查看")
            
    End Get
        
    End Property

        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 判断当前用户是否有执行某项操作的权限.
        
    ''' </summary>
        
    ''' <param name="strDo">操作</param>
        
    ''' <returns></returns>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-25    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable Function Has(ByVal strDo As StringAs Boolean
            
    If strDo Is Nothing OrElse strDo.Length = 0 Then
                
    Return True
            
    Else
                
    If Not ComponentManager.Permission Is Nothing Then
                    
    Return ComponentManager.Permission.Has(Me, strDo)
                
    Else
                    
    Return True
                
    End If
            
    End If
        
    End Function
    #End Region

    #Region "资源权限"
        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 筛选表达式.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2006-12-22    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property Filter() As IExpression
            
    Get
                
    If Not ComponentManager.Permission Is Nothing Then
                    
    Return ComponentManager.Permission.FilterExpression(Me)
                
    End If
            
    End Get
        
    End Property
        
    ''' -----------------------------------------------------------------------------
        
    ''' <summary>
        
    ''' 返回当前实体有那些字段对于当前用户设置了,不可见.
        
    ''' </summary>
        
    ''' <value></value>
        
    ''' <remarks>
        
    ''' </remarks>
        
    ''' <history>
        
    '''     [zqonline]    2007-03-09    Created
        
    ''' </history>
        
    ''' -----------------------------------------------------------------------------
        Public Overridable ReadOnly Property HideFields() As String()
            
    Get
                
    If Not ComponentManager.Permission Is Nothing Then
                    
    Return ComponentManager.Permission.HideAttribute(Me)
                
    End If
            
    End Get
        
    End Property
    #End Region

    #Region "重写基类方法"
        
    Public Overloads Overrides Function Retrieve(ByVal row As System.Data.DataRow, ByVal attributename() As StringAs Boolean

            
    If row Is Nothing Then
                
    Return False
            
    End If

            
    If attributename Is Nothing OrElse attributename.Length = 0 Then
                
    Return False
            
    End If

            
    If Me.HideFields Is Nothing OrElse Me.HideFields.Length = 0 Then
                
    Return MyBase.Retrieve(row, attributename)
            
    Else
                
    Dim name() As String
                
    Dim m As Integer
                
    For i As Integer = attributename.Length - 1 To 0 Step -1
                    
    If Array.IndexOf(Me.HideFields, attributename(i)) = -1 Then
                        
    ReDim Preserve name(m)
                        name(m) 
    = attributename(i)
                        m 
    += 1
                    
    End If
                
    Next

                
    Return MyBase.Retrieve(row, name)
            
    End If

        
    End Function
        
    Public Overloads Overrides Function Retrieve(ByVal dr As System.Data.IDataRecord, ByVal attributename() As StringAs Boolean

            
    If dr Is Nothing Then
                
    Return False
            
    End If

            
    If attributename Is Nothing OrElse attributename.Length = 0 Then
                
    Return False
            
    End If

            
    If Me.HideFields Is Nothing OrElse Me.HideFields.Length = 0 Then
                
    Return MyBase.Retrieve(dr, attributename)
            
    Else
                
    Dim name() As String
                
    Dim m As Integer
                
    For i As Integer = attributename.Length - 1 To 0 Step -1
                    
    If Array.IndexOf(Me.HideFields, attributename(i)) = -1 Then
                        
    ReDim Preserve name(m)
                        name(m) 
    = attributename(i)
                        m 
    += 1
                    
    End If
                
    Next

                
    Return MyBase.Retrieve(dr, name)
            
    End If

        
    End Function
    #End Region

    #Region "实体其它方法"
        
    Public Overrides ReadOnly Property AutoIncrement() As Core.IEntityField
            
    Get
                
    Return Nothing
            
    End Get
        
    End Property
        
    Public Overrides ReadOnly Property TableName() As String
            
    Get
                
    Throw New FrameworkException("没有指定实体对象的TableName.")
            
    End Get
        
    End Property
    #End Region

    End Class

    属性:Filter是用于控制用户只能获取那部份记录!如:只能显示自己的订单

    属性:HideFields是当前用户不能查看的字段有那些.

     待续

  • 相关阅读:
    html5画布
    html5标签及语义化
    MarkDown:基础知识
    20180624_Git分支管理之多人协作
    20180624_Git管理之Feature分支
    20180619_Git 分支管理之bug分支
    20180618_Git分支管理策略, 不使用Fast forward模式.
    20180618_Git分支管里之解决冲突
    20180618_Git的分支管理
    20180618_在githhub上创建远程仓库,再克隆远程仓库的代码
  • 原文地址:https://www.cnblogs.com/zqonline/p/1394611.html
Copyright © 2020-2023  润新知