收获并非无缘无故。
任何一款框架都应该有自己的菜单和权限管理策略,LML本来是没有的,后来借鉴了一下就有了。LML毫不保留的借鉴了公司正在使用的Castle.MonoRail框架的菜单和权限管理策略,以及权限审核策略,务求山寨的完美。由于本人能力有限,再者本人实际情况下并没有阅读过Castle.MonoRail的源码,所以粗糙之处敬请原谅,以后还定会加以改正和改进。
菜单即链接,LML中每一个Action中的任何一个方法都可以成为一个菜单,实际情况下我们从没有把一个没有返回视图的方法作为一个菜单,但是它可能对应一个权限。
权限并不是链接,但是访问链接,即使是通过菜单访问链接,都可能需要通过权限审核。链接和权限也有着莫大的关联。
虽然我可能解释的很粗糙,但是大家肯定能理解一下这样的关系:
1, 一个菜单就是有一个链接。
2, 一个链接的访问可能需要通过权限的审核,即一个链接(可能是菜单)可以对应一个权限。
还需要注意这样一点:
3, LML中权限并不会单独存在,它依托于一个菜单而展现存在。原因是:在我们这样的模块开发中,基本上一个Action类就对应一个模块,一个模块其实相当于一个菜单, 在这个Action类中出现的所有权限,都让它归属于这一个大菜单,便与收集和管理。
LML的菜单权限策略借鉴Castle.MonoRail,理解起来有些问题,请原谅。
使用LML的菜单和权限管理策略需要4步:
1, 配置菜单和权限初始化Bean,代码如下:
<bean id="InitMenuPower" class="LML.Core.System.InitMenuPower"> <property name="packages" value="LML.Action.System,LML.Action.Article"/> </bean>
初始化参数是需要初始化菜单和权限的包名,多个请使用英文逗号隔开。
2, 为Action配置定义权限拦截器,代码如下:
<interceptors> <interceptor name="power" class="LML.Core.System.PowerInterceptor"></interceptor> <interceptor-stack name="baseStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="power"></interceptor-ref> </interceptor-stack> </interceptors>
3, 为方法(链接)定义菜单和权限,LML中使用注解来定义,代码如下:
@SysMenu(MenuId = "System", MenuName = "系统管理", MenuPic = "sys.png", MenuParent = "", MenuLevel = 1, MenuSort = 1) @SysPower(PowerId = "SystemPower", PowerMenu = "System", PowerName = "系统管理查看") public void System() { }
Sysmenu各个参数的意义分别为:菜单ID,菜单名称,菜单图片,上级菜单ID,菜单层级,菜单排序。
Syspower各个参数的意义分别为:权限ID,所属菜单ID,权限名称。
4, 初始化。
初始化操作:收集系统中如第三步骤定义的菜单和权限,插入数据库永久保存。毫无疑问,数据库结构需要自行设计。
以上四个步骤做完了,系统将能够自动化收集菜单和权限,并能够进行管理。
下一集我们会说到初始化操作。
经过以上简单介绍,想必大家都知道在LML如何简单的使用菜单和权限了,我觉得就算是让你自行设计开发一套类似的菜单和权限管理策略,也是小零食一袋了。我一直对LML的要求就是足够简单,对于菜单和权限也不例外。没有很复杂的概念,也没有很复杂的语法,通过以上步骤就可以就使一个业务系统纳入较为灵活的菜单和权限管理。
当然了,这并不是完美的,必定简单的策略做不了太复杂的事情。献丑了。