struts1中权限控制的困惑

前提:
目前在修改一个struts1+ibatis的老系统。权限控制以常见的function->role->user来实现,
通过加载不同的菜单来控制用户的操作(菜单:即对应相应的action及method,保存在DB中)。

现状:
目前系统通过session来判断登录是否,Filter中判断getHeader("Referer")来检查来源。但是
Referer又很容易篡改,等于没做控制。

问题:
用户在登录成功后,我该如何防止用户直接输入action及method访问不该访问的页面?
在目前系统基础上,我该如何改进权限控制,小弟有点困惑了。 :(
(难道每个user再配置列表去判断是否有权访问这些action、method?)

望赐教。。

我是这么认为的:getHead("refer")在权限控制中,所涉及场景非常少。大多还是requestPath,也就是struts的ACTION。

那么这种ACL控制,可以这个可以通过Filter来解决,不需要任何代码。

如果你希望进一步将数据级权限管理,也提取出来。欢迎你看看我们的开源数据级权限产品:www.ralasafe.org/zh

[quote]每个user再配置列表去判断是否有权访问这些action、method[/quote]

这个好像不太可取!
可以给用户分组,级别之类的! 然给不同的组设置不同的权限!达到效果!

struts 1.2 的话可以 过滤器 或者
通过修改父Dispatchaction 达到控制权限,重写DispatchAction的execute方法,加入权限控制,后再调用父类方法

如:
[quote]
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);   


}  

[/quote]

http://www.ralasafe.org/zh/download
下载一下源码, 看看org.ralasafe.webFilter.UrlAclFilter和LoginFilter。