网上有很多关于权限管理系统的设计方案以及案例,甚至有相关的可以直接使用的权限管理框架。权限管理并非我的研究对象,我也只通皮毛,今天就在专家面前班门弄斧,简单介绍一下微软Dynamics AX系统的权限管理,以及由此派生出来的一种基于.NET的权限设计思想。
或许在看完本文后,你会觉得,我所提出的这个想法很火星,你早就知道这种方案了。不要紧,就当我在此将这些内容整理一下,以备日后参考便是了。
演练:体验Microsoft Dynamics AX的权限管理
- 在Dynamics AX中创建一个项目,在此命名为StudentsPrj,这个项目非常简单,就是维护一张数据表,表里包含了学生的ID、姓名以及年龄。如何创建项目就不介绍了,项目结构如下图:
注意上图中的SecurityKeys节点,下面有一个StudentsAdmin的Security Key,这就是AX中权限管理的关键所在。选中该节点,按下Alt+Enter,打开属性页面,设置StudentsAdmin的属性:
- 在Students数据表上,按Alt+Enter,打开属性页面,将该表的SecurityKey设置为StudentsAdmin:
- 同理,在Students Menu Item上,也设置SecurityKey为StudentsAdmin:
- 打开Main Menu –> Administration –> Users窗体,往系统用户中添加一个非Admin的域账户,以便我们做测试:
- 打开Main Menu –> Adminstration –> Setup –> User groups菜单,新建两个group,一个叫StuGuest,一个叫StuAdmin,分别表示StudentsPrj的Guest组和Admin组,单击Users选项卡,分别将Admin加入StuAdmin组,将saratoga加入StuGuest组:
- 选中StuAdmin,点击上图右边的Permissions按钮,打开权限设置对话框。在对话框的底部可以看到Students Administration权限选项,选中该权限,并选择Full Control选项:
- 同理,在User groups对话框中选择StuGuest组,同样打开上面的权限设置对话框,选择Students administration权限,并设置Access为View:
- 退出Dynamics AX,重新以Admin账户登录,进入Students project菜单,在Common Forms下有一个Students的菜单项,单击该菜单项,将打开Students窗体。你可以在这个窗体中执行增、删、改操作:
- 退出Dynamics AX,在AX的图标上单击右键,选择“Run as” 选项,以saratoga账户登录AX,你将发现,你仅可浏览Students记录。无法对其进行增、删、改操作:
思考:Microsoft Dynamics AX的权限管理设计
从上面的演练可以看到,Security Key是Dynamics AX的权限管理的核心。Security Key是一种对象,它关联了角色与权限:权限设置在Security Key上,而不是设置在角色上,而Security Key又关联了权限与系统中的对象。因此,它可以很明确地表述“谁在什么上有什么样的权限”。
我觉得我们可以在.NET的权限设计上,利用.NET的Attribute来模拟Security Key的功能。比如,我们可以设计一个MyPermissionAttribute,使其继承于PermissionAttribute,然后在对象上,应用这个MyPermissionAttribute,以表示该对象可以接受MyPermission的设置;之后提供一个界面,设计某些角色在MyPermission上具有什么权限,这样,也就意味着这些角色在MyPermission所修饰的对象上,具有设置的权限。这要比直接在角色上直接设置权限更加灵活。
使用Attribute的另一个好处就是,我们可以利用对象的继承关系来设计权限的继承关系,就好比AX中,Security Key都可以设置Parent Key一样。如果设置Parent Attribute具有Full Control的权限,那么可以认为,其子Attribute也具有Full Control的权限。
这些都是个人想法,具体细节还需要在实践中去体会和把握。