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

时间:2022-10-08 15:20:17

最近这两天对前两年设计的权限模块进行了重构,主要解决在进行权限配置很烦琐的问题!

对于大多数应用系统来说,都是使用了一个单独的功能来管理当前系统的用户权限.这样做本身没有什么问题,但是当模块比较多,权限比较多,同时系统功能增加比较多时,会发现进行用户授权是一件很麻烦的事.为什么不在我访问某一个窗口时,就可以进行用户授权呢,就像Windows下的文件夹权限管理一样.

 

如果你的系统里所有的窗体还是从System.Windows.Forms.Form继承的,那你需要进行重构了.首先创建一个基本类窗体,命名为FormBase.主要实现以下几个功能:

  1. 显示一个统计设置权限的菜单.
  2. 获取当前窗体,窗体中控件,窗体中实体对象的权限定义

http://www.cnblogs.com/zqonline/archive/2009/02/19/1393797.html

是如何把一个自定义菜单添加到系统菜单的代码,从网上转载的.

关于一个窗体的权限,可以分为访问和操作两种权限.

  当前用户没有权限访问此窗体

  当前用户有没有权限操作此窗体中的对象

可以通过反射技术获取窗体里的字段和属性,在根据窗体里的字段和属性获取对象,判断是否是一个有权限控制的对象,这样就避免在接下来的系统开发中,还要考虑是否把对象加入到权限控制.当然反射有比较大的性能损失,不过谁有事无事,就天天用权限设置呢.

 

 

 '先清除,已存在的对象
            Me.PurviewObjectList.Clear()

            
'添加窗体自身
            Me.AddPurviewObject(Me)

            
'获取自定义权限列表
            Me.PurviewObjectList.AddRange(Me.CustomPurviewObjectList)

            
'反射获取所有的字段
            For Each f As System.Reflection.FieldInfo In Me.GetType.GetFields(Reflection.BindingFlags.NonPublic _
                                                                    
Or Reflection.BindingFlags.Public _
                                                                    
Or Reflection.BindingFlags.Instance)
                
'判断是否是权限实体
                Dim obj As Object = f.GetValue(Me)
                
If TypeOf obj Is Lily.ComponentFramework.PermissionBase Then
                    
Me.AddPurviewObject(obj)
                
End If

            
Next

            
'反射获取所有的属性
            For Each p As System.Reflection.PropertyInfo In Me.GetType.GetProperties(Reflection.BindingFlags.NonPublic _
                                                                    
Or Reflection.BindingFlags.Public _
                                                                    
Or Reflection.BindingFlags.Instance)
                
'判断是否是权限实体
                If p.CanRead Then
                    
Dim obj As Object = p.GetValue(MeNothing)
                    
If TypeOf obj Is Lily.ComponentFramework.PermissionBase Then
                        
Me.AddPurviewObject(obj)
                    
End If
                
End If
            
Next

            
'获取LilyControlBase控件的权限对象
            GetControlPurviewObjectList()

            
Dim sb As New System.Text.StringBuilder
            
For Each obj As Object In Me.PurviewObjectList
                
If sb.Length > 0 Then
                    sb.Append(vbCrLf)
                
End If
                sb.Append(obj.ToString)
            
Next

           '调用权限设置方法
            
Dim objs As Object() = {Me.PurviewObjectList}
            Lily.ComponentFramework.ComponentManager.InvokeSingleMehod(
"PurviewInfo"Nothing, objs)

 

通过以下代码,就获取当前窗体所有的对象,当然从上面的代码,看出在写代码时,需要权限控制的对象只需要声明一个成员变量或创建一个属性即可.是不是比较简单呢.

 

待续