首页 | 博客群 | 公社 | 专栏 | 论坛 | 图片 | 资讯 | 注册 | 帮助 | 博客联播 | 随机访问
AppFuse1.8将会包含Acegi!- -| 回首页 | 2005年索引 | - -在线舞曲

使用Struts Menu实现权限管理

                                      

使用Struts Menu实现权限管理

      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本书,对于跨站脚本攻击还不太明白,如果哪位明白,请不吝指教,谢谢!^_^

                                                                                                                 兔八哥

                                                                                                          2005-3-3 18:49

 

      最近因为技术上的问题,频繁骚扰倦兔,发现因为认识倦兔后,我身上的压力小多了,因为我可以从他那里找到很多技术实现的想法和答案,而倦兔总是很热情,倦兔,真的谢谢你!!!(希望你能看到,^_^)

【作者: ltf_ty】【访问统计:】【2005年03月3日 星期四 18:47】【注册】【打印

搜索

Google

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=863246

来自招聘网招聘网的引用:

招聘网

回复

- 评论人:#10   2008-07-06 09:15:50   

兔八哥我安装游戏需要超级权限要怎么改?
我不会懂 如果你您看到 就发我的msn那里面聊
谢谢!

- 评论人:#10   2008-07-06 09:15:23   

兔八哥我安装游戏需要超级权限要怎么改?
我不会懂 如果你您看到 就发我的msn那里面聊
谢谢!

- 评论人:#10   2008-07-06 09:15:21   

兔八哥我安装游戏需要超级权限要怎么改?
我不会懂 如果你您看到 就发我的msn那里面聊
谢谢!

- 评论人:aect-wyg   2005-03-27 12:49:19   

兔八哥,谢谢你,我以前没有正式研究过开源的项目,但是我对这方面比较感兴趣,正如你说的“我选择,我郁闷”,我的qq:76618976,msn:wang_yougui@hotmail.com,希望能成为你的朋友

- 评论人:aect-wyg   2005-03-27 12:37:08   

兔八哥,谢谢你,我以前没有正式研究过开源的项目,但是我对这方面比较感兴趣,正如你说的“我选择,我郁闷”,我的qq:76618976,msn:wang_yougui@hotmail.com,希望能成为你的朋友

- 评论人:兔八哥   2005-03-26 18:55:18   

to aect-wyg
我也没有很好的建议,我是从AppFuse开始的,但Struts Menu有很多例子,你可以看看,^_^

- 评论人:aect-wyg   2005-03-25 08:38:29   

兔八哥,昨天网上听到一个哥们给我讲struts-menu,我想用struts-menu,但是不知从那里入手,能否给点入门建议

- 评论人:兔八哥   2005-03-07 08:57:59   

to 楼上的朋友,你说的没错,我也是想使用Acegi来控制权限的,我们的想法是一样的。
使用Struts Menu的确是界面上的易用性考虑的,我的题目起的不是很恰当,呵呵

- 评论人:匿名网友   2005-03-05 21:45:17   

另外,这种做法并没有完全实现控制用户操作的作用,因为用户只是不能看到某个功能的菜单链接而已,如果,他记住了有操作权限的人员操作时发出的请求的URL,比如:http://rabbit8.blogchina.com?edit?method=delete&sid=5,那么,他就可以手工输入URL,同样可以删除、修改、查看某些他不应该看到的东西

这个问题使用acegi security可以完全解决,如果用户对这个页面没有权限的话,他是肯定进入不了这个页面的。

还有不知道你是否对我的思路有些理解错误,我的权限控制体系是加载在页面上的,即对某个页面用户是否用于权限。

这样即使用户直接输入页面地址,如果用户没有登陆的话,会被系统重定向到登陆页面,如果用户已经登陆但是没有此页面的权限的话,会出现404(希望没有记错),permission deny页面:)

这样即使你显示所有菜单,用户通过菜单也是不能进入没有权限的页面的,没有权限的菜单其实是location没有权限的菜单,隐藏这种菜单只是从用户界面的友好性考虑,而不是绝对的权限考虑:)

不知道我对你的理解是否正确,但我的实现不是用来通过菜单控制权限,而是通过权限控制菜单的显示。

- 评论人:匿名网友   2005-03-05 20:08:26   

支持!

- 评论人:China_彬   2005-03-04 10:15:08   

呵呵,偶也要用这个了正要研究呢,可惜天天在java和.net折腾,用java把工作流刚写了一半,又要用c#开发另一个项目,过一个星期在弄struts-menu吧,感觉还是java的opensource好啊!坚持啊,偶会经常来光顾的!!!

- 评论人:China_彬   2005-03-04 10:00:35   

呵呵,一直准备用struts-menu,可一直没时间,天天在.net和java上折腾,用java写的工作流要用到这个菜单的权限,还没等要去弄,又用c#去开发另一个项目,不过还是java的opensource好啊!坚持写啊,偶会经常来看看你的!

验证码:   
评论内容: