最近我在学习J2EE,在action层中有很多的方法比如:
newsDoc.do?cmd=update 这个方法必须要登陆后才能访问,
newsDoc.do?cmd=list 这个方法则可以不需要登陆也能访问.
大体也就是有很多的crud(增\删\改\查) 而有一些增\删\改是需要用户登陆后才能访问调用这个方法的.
而有的地方比如查\增则不需要登陆也可以访问调用这些方法.
没有使用权限框架比如acgei 就是普通的session记录用户登陆.请问应该如何最优的设计呀.
maoweiwer,我终于看到有人有这样的需求了,我以前用ssh自己写了一个,现在我把它用rails实现了,不知道能不能帮你.
我是把xxxAction.do这样的保存到模块表中,把cmd=delete,cmd=list这样的保存到功能表中,用户的权限和这些模块表和功能表关联,在用户登录的时候,通过关联查询把用户的权限列表保存在session中,
也户的权限列表其实就如同这个样子:
newsDoc.do?cmd=update
newsDoc.do?cmd=list
每一次用户请求某一个链接的时候,有一个权限过滤器会起作用的,它会先取请求的url与session中的权限列表对比,如果包含,说明是经过授权的,可以继续执行,否则重定向到"你没有此操作权限"的页面.
我用rails 做的
[url]http://rails2.iteye.com/blog/215074[/url]
由于是rails ,所以代码比java少得很多,不知道你了不了解一点rails和ruby,其实你只要把这篇文章中所讲的思想搞懂了就可以有助于你这个权限控制了.
我曾经没有使用acgei 可能跟楼主的情况不大一样,相似,拿出来分享一下:是这么处理的:
在Action中访问首先检查有没有登陆(前提是登陆要在回话中保存登陆信息),简单介绍一下,
[code="java"]
User user = (User ) request.getSession().getAttribute("user");
if (user == null) {
request.setAttribute("loginMessage", "超时或服务器故障,请与系统管理员联系");
logger.info("超时或服务器故障,请与系统管理员联系");
return actionMapping.findForward("login");
}
[/code]
loginMessage 是向页面发送的消息
控制操作功能按用户的角色或权限,在jsp中
[code="java"]
…… /logic:equal
/logic:match
[/code]
如果你想在业务中进一步控制方法,可以把User传到到业务中去,需要登陆的就检查User信息,不需要的就不用管了。
我还是建议楼主研究一下acgei,看看他的设计思想是怎么样的,在这方面SpringSide做的很全面。
一般都在action中取权限的
如果楼主觉得这样的设计不好的话,确实很麻烦
楼主可以写这样一个类,继承struts的action
覆盖掉process()方法
在process()方法中加入权限判断就好啦