枫言枫语

—— by 玉澍淋枫
posts - 0, comments - 0, trackbacks - 0, articles - 14
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

使用Struts Menu实现权限管理

Posted on 2007-08-06 13:10 玉澍淋枫 阅读(298) 评论(0)  编辑  收藏 所属分类: Struts
Struts Menu也是Matt Raible的作品,我以前一直在找能够在Java里面指定实现页面上树形菜单和下拉菜单的东西,我去年找到一个JS的东西,可以从XML文件中读取结 构,我使用XSLT来生成显示的菜单,后来感觉不灵活,也没有用到项目上,2004年11月开始接触AppFuse,发现里面有个Struts Menu,从例子看起来外观还不错,用起来,发现更不错,可以在配置文件中指定那些角色可以看到当前的链接,如果roles中没有指定的角色进入系统后, 则自动隐藏。我在去年的一个小项目用了一下,发现还行,至少不用我把逻辑嵌入到一堆JS里面。

      因为今年上半年要对以前的一个系统进行升级,要根据用户或者角色的权限把一些菜单隐藏起来,如果使用Struts Menu的roles的话,则角色是写死在代码里面的,就是"硬编码"(hardcode),而且这里的角色是Application Server上配置的,在Tomcat上配置还算简单,在WebLogic等大型的服务器程序上配置,必须使用他们提供的Console软件,否则,要自 己写好几个文件,比较繁琐,而且这些角色是在安装是就指定的,如果用户以后想添加新的角色名字,还要修改应用服务器的配置文件(不管是手工,还是代码处 理)。

      如果你的系统负责处理权限,如生成用户、角色,还要为角色、用户指定有操作哪些模块的哪些操作,一个系统很可能有几十个或者上百个角色(往极端情况去想, 呵呵),那么如果能够动态的控制显示哪些菜单项是我们系统中必须解决的问题,而Struts Menu完全胜任这样的要求,具体实现可以参看Struts Menu的下载文件中的文档,需要重点看的是http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp(动态构建菜单结构)和http://struts-menu.sourceforge.net/security.html(这 篇文章我视而不见,以为没有用处,谢谢倦兔的提醒,^_^)。这两篇文章的用法是独立的,并不一定都要实现,如果你的菜单项是固定的,短期不会有所变动, 那么可以写死到配置文件中,然后用第二篇文章中说的那样,写一个类,实现接口PermissionsAdapter,isAllowed方法中传入菜单项 的名字,然后决定是否显示该项菜单,

       String[] menus = request.getParameterValues("menuNames");

       注释:menuNames是从数据库中读出的记录的集合(数组),你也可以用其他机构,

       然后放入使用request.setAttribute("menuNames",   String[] 变量)  放入request中。

       PermissionsAdapter permissions = new SimplePermissionsAdapter(menus);//menus是菜单名字的数组
       request.getSession().setAttribute("YourAdapter", permissions);}  //"YourAdapter"随便起的名字,
       //但要和配置文件中的permissions="YourAdapter""部分的一致。
     

      在里面添加permissions="你的类名"(上文中是"YourAdapter),如果此处的perssions的值为 "rolesAdapter",则Struts Menu不会从寻找你的Adapter类了,而是直接创建一个RolesPermissionsAdapter实例,然后使用这个实例处理角色(根据配置 的rolse的角色名字判断是否显示菜单项)。其实PermissionsAdapter是RolesPermissionsAdapter类的一个具体 的实现,如果你不写自己的适配器,则Struts Menu使用自己的这个适配器处理菜单显示。

      后一篇文章的最后还举了一个过滤器实现上述功能的例子,你可以参考一下,这个试验并不是完全由我实现的,是由倦兔提供思路和文档的URL,我只是把思路整理一下,让其他同事实现,我把它记录下来,以免以后再看的时候忘了。^_^

      另外,我还发现Struts Menu的例子里面还有关于Tab页的实现脚本,如果我早点发现它,我就不会在上一个系统中每个JSP页面都嵌入一大堆同样的Table垃圾代码了!!!

      另外,这种做法并没有完全实现控制用户操作的作用,因为用户只是不能看到某个功能的菜单链接而已,如果,他记住了有操作权限的人员操作时发出的请求的 URL,比如:http://rabbit8.blogchina.com?edit?method=delete&sid=5,那么,他就可以 手工输入URL,同样可以删除、修改、查看某些他不应该看到的东西,这有些属于Web安全方面的东西了,呵呵,如果想实现更加完善的权限管理功能,还应改 在执行操作前进行用户身份和权限的验证,从而避免上述方法的攻击或者破坏。如果你对这方面的内容感兴趣,可以查看一些相关书籍,如《Web安全大曝光》、 《J2EE安全大曝光》系列,我春节期间看了这2本书,对于跨站脚本攻击还不太明白,如果哪位明白,请不吝指教,谢谢!^_^