在开发系统过程中,项目都是由多个模块组成的,多个模块里又有多个动作,就这需要用到权限判断了比如说 “信息管理”这个模块下包括:添加信息,修改信息,删除信息有的用户只有 “添加信息”,有的用户有“修改信息”权限,那我如何在用户进行添加信息时进行判断呢,
以前都是硬编码的方式写在代码里的现在用struts2,他的拦截器是否可以控制,如何控制?

解决方案 »

  1.   

    权限最核心的是业务逻辑,具体用什么技术来实现就简单得多。
    通常:用户与角色建立多对多关系,角色与业务模块构成多对多关系,权限管理在后者关系中。
    对权限的拦截,如果系统请求量大,可以用Struts2拦截器来做,请求量小可以放在filter中。但一般单级拦截还不够,要做到更细粒度的权限控制,还需要多级拦截。
    可参考以下文章,做法都差不多。
    http://howsun.blog.sohu.com/106725713.html
      

  2.   

    感觉如果用拦截器的话,如果 用户中规中矩的再页面上点击倒是可以,如果他猜到路径,直接输入***.jsp,那么拦截器就没用了,因为struts2默认的拦截器只对.action有用的吧.不知道有没有好的解决方法.
    期待中....
      

  3.   

    以前的时候用的是boolean permiss = UserPriviele.check(用户,模块id,操作);
    if (!permiss) 进行处理。其实拦截器也可以实现,但是有个问题,就是在每个action下都要写配置,如下
    <action name="index" >         
                <result name="success">/UI/system/index.jsp</result>            
                <interceptor-ref name="rbac">
    <param name="moudel">007</param>
    </interceptor-ref>         
            </action>
    public String intercept(ActionInvocation invoker) throws Exception {
    RoleDAO dao = DAOFactory.getInstance().getRoleDAO();
    HttpServletRequest request = ServletActionContext.getRequest();
    UserManager mgr = new UserManager(request);
    try {
    int userid = mgr.getUserInfo().getUserId();
    String subvision = mgr.getUserInfo().getUserArea();
    boolean permisses = dao.isUserMoudel(userid, moudel, subvision);
    if (permisses) {
    return invoker.invoke();
    } else {
    return FORBIDDEN;
    }
    } catch (Exception ex) {
    return FORBIDDEN;
    }
    }
      

  4.   

    在action中的方法都存储到数据库或者xml里,然后在拦截器中去判断XX.action?action=XX来进行判断
      

  5.   

    将jsp放到web-inf目录里就好了。
    访问不到的。
      

  6.   

    拦截器也得自己写代码啊,不要把struts2想的太强大了,利用拦截器也的知道你的用户到底有多大权限,N楼有人说用  boolean permiss = UserPriviele.check(用户,模块id,操作),这个Chick方法也得知道你这个用户有没有模块ID下的某个操作权限,拦截器只是提供一个操作execute()方法前后的方法加入点,真正的拦截还得自己清楚,比如N楼那个同志的方法  check(用户,模块id,操作),首先你在用户登录的时候就得把用户的一些基本权限保存到session中,里面必须有该用户与模块和操作的关联关系,这是必须的,不然即使你建立一个事前连接器,内容也没办法写吧!
      

  7.   


    把你的页面放到WEB-INF目录下,解决~
      

  8.   

    哎 我还不如直接用jstl标签来做呢
      

  9.   

    #8楼回答的是,要将jsp文件放在web-inf下,这样就不能直接访问了,还有,所有的jsp页面最好都是通过action来控制跳转,不要直接在jsp页面之间跳转,这样拦截器就可以都进行管理了!
      

  10.   


    s2的拦截器example:<struts>
    <package name="crud"  extends="struts-default">
    //定义一个拦截器
       <interceptors>
          <interceptor name="logincheck" class="com.softeem.myintercptor.LoginIntercptor"></interceptor>
       </interceptors>
       <global-results>
         <result name="login">index.jsp</result>
       </global-results>
       <action name="*login" class="com.softeem.action.LoginAction" method="{1}">
          <result name="success">success.jsp</result>
       //使用name为logincheck的拦截器
          <interceptor-ref name="logincheck"></interceptor-ref>
       </action>
    </package>
    </struts> 一个拦截器可以被使用在多个action中
      

  11.   

    struts2 有个 filterdispatcher 管理所有路径。。可以 重写这个类 。拦截相关信息。
      

  12.   

    可以在数据库中 建一个表啊      权限表    就两个字段  用户ID  和 管理模块ID   然后再前台显示的时候 该用户管理的模块 直接从数据库读取