问题描述
前提:目前在修改一个struts1+ibatis的老系统。权限控制以常见的function->role->user来实现,通过加载不同的菜单来控制用户的操作(菜单:即对应相应的action及method,保存在DB中)。现状:目前系统通过session来判断登录是否,Filter中判断getHeader("Referer")来检查来源。但是Referer又很容易篡改,等于没做控制。问题:用户在登录成功后,我该如何防止用户直接输入action及method访问不该访问的页面?在目前系统基础上,我该如何改进权限控制,小弟有点困惑了。 (难道每个user再配置列表去判断是否有权访问这些action、method?)望赐教。。 问题补充:多谢解疑。不过你说的通过Filter来并且不需要任何代码,能否说的再详细点?小弟不胜感激。metadmin 写道
解决方案
我是这么认为的:getHead("refer")在权限控制中,所涉及场景非常少。大多还是requestPath,也就是struts的ACTION。那么这种ACL控制,可以这个可以通过Filter来解决,不需要任何代码。如果你希望进一步将数据级权限管理,也提取出来。欢迎你看看我们的开源数据级权限产品:www.ralasafe.org/zh
解决方案二:
http://www.ralasafe.org/zh/download下载一下源码, 看看org.ralasafe.webFilter.UrlAclFilter和LoginFilter。
解决方案三:
引用每个user再配置列表去判断是否有权访问这些action、method这个好像不太可取!可以给用户分组,级别之类的! 然给不同的组设置不同的权限!达到效果!struts 1.2 的话可以 过滤器 或者通过修改父Dispatchaction 达到控制权限,重写DispatchAction的execute方法,加入权限控制,后再调用父类方法如:引用 public abstract class BaseDispatchAction extends DispatchAction { // 初始化ActionMessages,以方便其继承的类使用 protected ActionMessages messages = null; @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO Auto-generated method stub String method= request.getParameter("method"); Permission ps = this.getPermission(mapping, request); ps = new Permission(true,true,true,true,true); if ("list".equals(method)) { if(ps.canAccessOrRead()) { return super.execute(mapping, form, request, response); }else { throw new ErrorCodeException(MessageConst.EXCEPTION_10002,"can not read or access..."); } } return super.execute(mapping, form, request, response); }