最近这两天对前两年设计的权限模块进行了重构,主要解决在进行权限配置很烦琐的问题!
对于大多数应用系统来说,都是使用了一个单独的功能来管理当前系统的用户权限.这样做本身没有什么问题,但是当模块比较多,权限比较多,同时系统功能增加比较多时,会发现进行用户授权是一件很麻烦的事.为什么不在我访问某一个窗口时,就可以进行用户授权呢,就像Windows下的文件夹权限管理一样.
如果你的系统里所有的窗体还是从System.Windows.Forms.Form继承的,那你需要进行重构了.首先创建一个基本类窗体,命名为FormBase.主要实现以下几个功能:
- 显示一个统计设置权限的菜单.
- 获取当前窗体,窗体中控件,窗体中实体对象的权限定义
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(Me, Nothing)
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)
通过以下代码,就获取当前窗体所有的对象,当然从上面的代码,看出在写代码时,需要权限控制的对象只需要声明一个成员变量或创建一个属性即可.是不是比较简单呢.
待续