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是当前用户不能查看的字段有那些.

 

 

 待续

 

 

posted on 2009-02-20 10:49  zqonline  阅读(560)  评论(0编辑  收藏  举报

导航