我写过的一些代码,你做下参考在用户登陆时,设置2个session
session.setAttribute("login","true");//简单的判断登陆状态,可以在表里做个字段,登陆时改那个字段的值也可以;
session.setAttribute("userGroup","admin");//登陆时根据表里的用户组ID,来定义不同的SESSION值;在一个类文件中定义一个获取用户组信息的方法:
public String checkUserGroup(int userGroupID){
String msg=null;

switch(userGroupID){ 
case 0: msg = "admin";break;
case 1: msg = "user";break;
default : msg = "guest";//可以根据需求加用户组
}
return msg;
}
}//end checkUserGroup 在登陆的servlet或JSP页里使这个方法就可以得到相应的组名了;用这2个SESSION值来判断用户的状态和组;再写一个filter,doFilter方法大致如下
public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
{
HttpServletRequest hreq = (HttpServletRequest)req;
HttpServletResponse hres = (HttpServletResponse)res;
HttpSession session = hreq.getSession();
String isAdmin = null;

try{
isAdmin = (String)session.getAttribute("userGroup");//获得页面的session值
if(!(isAdmin==null) && isAdmin.equals("admin") ){//判断其是管理员则放行;
chain.doFilter(req,res);
}else{
System.out.println("is not admin");//测试使
hres.sendRedirect(error_page.jsp);
}
}catch(Exception e){
e.printStackTrace();
}
}//end doFilter写好过滤器后,去项目的web.xml里进行filter的设置,设置其要进行保护的文件夹:
<filter>
<filter-name>CheckAdminGroup</filter-name>
<filter-class>bookshop.filter.CheckAdminGroup</filter-class>
</filter>
<filter-mapping>
<filter-name>CheckAdminGroup</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CheckAdminGroup</filter-name>
<url-pattern>/secret/*</url-pattern>
</filter-mapping>这样你在admin,secret里的所有资源,就都被这个过滤器保护起来了,一个过滤器可以对多个资源进行保护,你就按这样的思路,再写个判断用户是否登陆,和一个用户是否属于用户组的过滤器,就实现权限分级了;

解决方案 »

  1.   

    假设你的方法封在MyClass.java里了
    用户登陆时,组的session设置:
    int userGroup = 你从库中提出的值;
    session.setAttribute("userGroup",new MyClass().checkUserGroup(userGroup));
      

  2.   

    设置用户:tomcat\conf\tomcat-users.xml
    然后例子你就照着:tomcat\webapps\examples\WEB-INF\web.xml
    下的<security-constraint>这部分配就好了
      

  3.   

    谢谢darkula(流浪街头的呆子)的示例!此问题结贴后我另外再给你分好吗?重要的是你的这些提示给了我很大的信心!^_^
    cnfalcon(中国猎鹰)我前面的问题在http://community.csdn.net/Expert/topic/3690/3690125.xml?temp=.69331 
    MopeLeo(烂迹天涯)因为时间紧迫我也想先这么做 可是BOSS不答应!-_-我想我没说清楚吧。现在我手头有用户表(user)、用户对应角色表(usermappingrole)、用户对应操作表(usermappingoperation)、角色表(role)、角色对应操作表(rolemappingoperation)、操作表(operation)、名单(employee)7个表。
    我对权限设置具体步骤不是很了解,现在得按BOSS的意图写。尽量帮帮我吧!我想问的是:
    1。一开始,我想用一个二进制数组对应权限(因为划分等级较多以及考虑可扩展性)。这里二进制如何转换十进制呢?希望有例子。(翻遍CSDN只找到可用的十进制转二进制的语句,可惜这里没用)
    比如我设定了除admin之外的6级权限(比如0000 0000 对应一级),那么我要定义一个有6个部分的二进制数组吧。那么我把数组转换为十进制的数字串后,用什么方法使对应等级的用户获得这个数字串呢
    2。谁了解表之间的对应还有映射关系,能不能介绍一下。
    3。看了别人的帖子,好象权限可以以树结构来一级级关联起来(比如superadmin->admin->),但是都是讲方法没有具体的说,能否给出简单的示例、方法来?
    4。设定好各级权限后怎样使各级别只能看到权限内的页面或者数据(不明白其中的具体方法和语句)
    5。设定好各级权限后,怎样使各级别只能执行相应的操作(添加删除等)也是不明白方法语句
    6。具体要改动或者添加哪里的baen和XML?(除了上面大大说的以外)还需要写什么类呢?
    7。我对过滤器还不是很熟悉,大大帮忙写个简单的判断用户是否登陆,和一个用户是否属于用户组的过滤器行吗?
    8。父 -》子 -》位置 逻辑上来设计具体如何实现,能否给个例子
    9。页面上写好权限语句,那么我这个划分级别的方法怎么通过父 -》子 -》位置 和数据库的表对应起来呢?
    10。很简单的问题,就是不明白:登陆页面中只有用户ID和PWD,如何通过SESSION与权限绑定并在所有页面里起到作用?(首先就是不明白传递ID和PWD的SESSION写法)。先想到这些,半夜提问语无伦次,希望表尽情的BS我啊,分不多,差不多这次就散干净了,希望能抛砖引玉。
      

  4.   

    权限的分配可以分按具体的功能分配和按资源的分配,建一个专门的用户权限对应表用以存放每个用户的相关权限.功能的分配是用户的可进行操作的项,资源的分配就是用户具体操作涉及到数据库中数据时的限制(比如说id<100的系统参数普通用户不可改等限制).功能的分配可以提供功能树链接来面向用户,当然连接得通过action来转入以避免用户直接打url就可进入,资源的分配也得建一个表,用于确定用户对于某个功能的数据操作限制.
        还有为了便于管理,最好有角色作为权限的载体,一个用户实际的权限可以这样组成:专门分配给他的和他所具有的所有角色的权限合集.
        这是我上一个工程的权限模块的大体做法,在此抛砖引玉........希望得到大家的指正......
      

  5.   

    权限分配可能用STRUTS会好做点,但我还没有开始看,抱歉现在只能想到这些,可能高手们比较懒的回答这些问题吧,我前不久自己钻时也很痛苦,能了解你的心情:P,给你个写过的判定用户是否登陆的FILTER:
    /*
      判断发送请求的用户,是否已登陆
    */
    package bookshop.filter;import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;public class ConfirmLogin extends HttpServlet implements Filter{
    String error_page = "/bookshop/error";
    private FilterConfig filterConfig;

    /*
               做主要的过滤动作
    */
    public void doFilter(final ServletRequest req,final ServletResponse res,FilterChain chain)throws IOException,ServletException
    {
    HttpServletRequest hreq = (HttpServletRequest)req;
    HttpServletResponse hres = (HttpServletResponse)res;
    HttpSession session = hreq.getSession();
    String loginPass = null;

    try{
    loginPass = (String)session.getAttribute("login");//这里的login是在用户登陆时打进session的值 if(!(loginPass==null) && loginPass.equals("true") ){
    chain.doFilter(req,res);
    }else{
    hres.sendRedirect(error_page);
    }
    }catch(Exception e){
    e.printStackTrace();
    }
    }

    /*
      初始化
    */
    public void init(FilterConfig config)throws ServletException{
    this.filterConfig = config;
    } /*
               销毁过滤器
    */
    public void destroy(){
    this.filterConfig = null;
    }
    }---------------------------------------------------
    编译后再去你项目的WEB-INF下设置web.xml
    <filter>
    <filter-name>confirmLogin</filter-name>
    <filter-class>bookshop.filter.ConfirmLogin</filter-class> 
    </filter>
    <filter-mapping>
    <filter-name>confirmLogin</filter-name>
    <url-pattern>/admin/*</url-pattern>
    </filter-mapping><filter-mapping>
    <filter-name>confirmLogin</filter-name>
    <url-pattern>/user/*</url-pattern>
    </filter-mapping><filter>标是对你的过滤器类文件的定义,然后在<filter-mapping>中使用你定义的虚拟名称来对要保护的资源地址进行定义,可以是多个,也可以是servlet;这样再配合上面说的权限判定的filter,就可以实现权限分级了;不过后来想想这样还是麻烦,要为每一组的用户都写一个filter……这样写还是为了练练手,新人嘛~~~再来看你的表结构:用户对应操作表(usermappingoperation)<--这个表是做什么用的?记录用户操作时的参数?做数据库操作时,用Hibernate会好点吧,但还是老问题。。我也刚开始看这东西我最近刚写了一个多表操作的模块,实现的方法也还是比较笨供你参考下吧:每个表对应2个类文件,一个是set && get的方法,另一个是对这个表的所有操作,例如:删除,插入,更新等;
      

  6.   

    对应你的user表,写2个类文件看看吧:
    首先是set && get的类,用来做传递数据使:
    package myProject.sample;import java.io.*;public class User implements Serializable{
      //每个变量对应表的字段,名字尽量一样
      private int userID; 
      private String userName;
      private int userGroupID;
      
      //每个变量对应set && get方法,进行存取,字段的排列也尽量和表的一致
      public void setUserID(int id){
        this.userID = id;
      }
      public int getUserID(){
        this.userID;
      }
      public void setuserName(String name){
        this.userName = name.trim();
      }
      public int getUserName(){
        this.userName;
      }
      public void setUserGroupID(int id){
        this.userGroupID = id;
      }
      public int getUserGroupID(){
        this.userGroupID;
      }  
    }
    -------------------------------------------
    然后去写个对应用户表的操作类:
    package myProject.sample;import java.sql.*;public class UserManager{
      private Connection conn;//这个用来创建连接数据库
      private PreparedStatement pstmt;
      private ResultSet rst;
      
      //实例化时获得一个连接
      public UserManager(){
                      //这个方法是写在数据库连接的类里,方法是静态的
    conn = DBConnection.getConnection();
    }  
        /*
      插入一条用户记录
    */
    public void addUser(User userInfo){//这里接收的对象,需要是User的
    try{
    pstmt = conn.prepareStatement("insert into user(userid,username,usergroupid) values(?,?,?)");
             pstmt.setInt(1,userInfo.getUserID());//这里就是刚才写的方法
                               pstmt.setString(1,userInfo.getUserName());
                               pstmt.setString(1,userInfo.getUserGroupID()); pstmt.execute();
    }catch(Exception ex){
    }finally{
    try{
    conn.close();
    }catch(SQLException ex){
    }
    }//end finally block
    }//end addUser method
    }
    ----------------------------------------------
    这样你在servlet或JSP里写时,只要实例化这2个类,然后,再把相应的值,该转的转,该限制的限制后,就可以插进库里了;
    User user = new User();
    UserManager userManager = new UserManager();
    //接前页的值
    int userID = Integer.parseInt(req.getParameter("userID"));
    String userName = req.getParameter("userName");
    int userGrpID = Integer.parseInt(req.getParameter("userGroupID"));
    //将三个值分别设置进User
    user.setUserID(userID);
    user.setUserName(userName);
    user.setUserGroupID(userGrpID);
    //然后调用刚写好的方法,将其插进表里
    userManager.addUser(user);OK,搞定,其他的地方都是细节的了,大体的操作都是如此;要注意的就是,象这样写的操作表的类,在同一servlet里使时,要每次调用方法,就创建一个新的实例,因为每次操作结束,连接都会被关掉,为这问题我郁闷了8小时进去……教训呀…… 最好写个创建实例的类,每次取实例都去那里调条方法出来就OK了~~~
      

  7.   

    ...这里写错了,应该顺序排下去……SORRY……
         pstmt.setInt(1,userInfo.getUserID());
         pstmt.setString(1,userInfo.getUserName());
         pstmt.setString(1,userInfo.getUserGroupID());
    改成:
         pstmt.setInt(1,userInfo.getUserID());//这里就是刚才写的方法
         pstmt.setString(2,userInfo.getUserName());
         pstmt.setString(3,userInfo.getUserGroupID());
      

  8.   

    恩  学习ing~~~~~期待更多的讨论!帖子周一结贴!!!