CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  Web 开发

【100分】求权限分配全过程!

楼主black_flame(连滚带爬做IT)2005-01-06 17:21:15 在 Java / Web 开发 提问

上次发过一个权限的帖子,大家都是讲了下框架和设计思路方面的想法。  
  其实我自己也看了一些权限的文章,现在的状态就是设计思路明白,但是不知道具体该怎么写!  
  希望各位大大能简单的给出关键语句部分的写法,最好能写写从最开始类和方法的定义到最后怎样实现!  
  我现在的情况是:以前的权限模块已经写好,现在不知道怎么添加权限属性,怎么把权限属性与用户其他属性一起绑定,导入数据库或者遍历全过程。还有不知道怎么分配多级权限? 问题点数:100、回复次数:27Top

1 楼wadsunglow(东)回复于 2005-01-06 17:33:23 得分 0

upTop

2 楼classjava(原始野人)回复于 2005-01-06 17:40:02 得分 0

帮upTop

3 楼dvictor(大学之道 在明明德)回复于 2005-01-06 17:51:58 得分 0

关注......Top

4 楼cnfalcon(中国猎鹰)回复于 2005-01-06 17:54:55 得分 0

发的帖子在什么地方,帖一下看看Top

5 楼darkula(流浪街头的呆子)回复于 2005-01-06 18:09:25 得分 50

我写过的一些代码,你做下参考  
   
  在用户登陆时,设置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里的所有资源,就都被这个过滤器保护起来了,一个过滤器可以对多个资源进行保护,你就按这样的思路,再写个判断用户是否登陆,和一个用户是否属于用户组的过滤器,就实现权限分级了;  
   
  Top

6 楼darkula(流浪街头的呆子)回复于 2005-01-06 18:13:18 得分 0

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

7 楼darkula(流浪街头的呆子)回复于 2005-01-06 18:39:40 得分 0

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

8 楼MopeLeo(烂迹天涯)回复于 2005-01-06 18:49:18 得分 0

写个页面给超级管理员手动的给角色赋予权限,然后添家用户的时候分配相应的角色就可以了啊!Top

9 楼nouveau(路漫漫其修远兮)回复于 2005-01-06 19:00:10 得分 0

markTop

10 楼black_flame(连滚带爬做IT)回复于 2005-01-07 03:10:31 得分 0

谢谢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我啊,分不多,差不多这次就散干净了,希望能抛砖引玉。Top

11 楼joyaga(joyaga)回复于 2005-01-07 08:01:21 得分 0

学习学习顶Top

12 楼speedingman(尘埃)回复于 2005-01-07 09:00:07 得分 0

upTop

13 楼boneeater(狗狗)回复于 2005-01-07 09:33:38 得分 10

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

14 楼prcgolf(小鸟)回复于 2005-01-07 09:40:58 得分 0

upTop

15 楼dvictor(大学之道 在明明德)回复于 2005-01-07 09:41:51 得分 0

upTop

16 楼lmcctvjava(无心)回复于 2005-01-07 10:13:03 得分 0

mark  
  Top

17 楼wangkunhong(乔.Jo)回复于 2005-01-07 10:19:38 得分 0

没做过UP。。Top

18 楼black_flame(连滚带爬做IT)回复于 2005-01-07 13:15:20 得分 0

希望高手能来详细谈谈具体操作步骤啊~~~~~Top

19 楼damaha999(追求成功的男人)回复于 2005-01-07 13:38:59 得分 0

up     studing  
  Top

20 楼tangyongtgyg(星***辰)回复于 2005-01-07 13:50:00 得分 0

学习Top

21 楼darkula(流浪街头的呆子)回复于 2005-01-07 15:24:32 得分 20

权限分配可能用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的方法,另一个是对这个表的所有操作,例如:删除,插入,更新等;  
   
   
   
   
   
  Top

22 楼darkula(流浪街头的呆子)回复于 2005-01-07 15:55:00 得分 20

对应你的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了~~~Top

23 楼darkula(流浪街头的呆子)回复于 2005-01-07 15:56:26 得分 0

...这里写错了,应该顺序排下去……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());Top

24 楼seakingwy(JAVAing~重新开始)回复于 2005-01-07 16:57:17 得分 0

期待!Top

25 楼black_flame(连滚带爬做IT)回复于 2005-01-07 21:11:47 得分 0

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

26 楼black_flame(连滚带爬做IT)回复于 2005-01-09 12:03:16 得分 0

顶上去   !!!期待留言~~~Top

27 楼pengpong(网上飘)回复于 2005-05-11 10:21:15 得分 0

haotieTop

相关问题

  • 用户权限分配
  • 关于CVS的权限分配问题
  • 关于权限分配问题
  • 请问如何分配表的权限?
  • SQL Server权限和应用程序权限分配问题!!
  • QJ全过程
  • WindowsXP下面能否分配访问NTFS目录的权限?
  • 菜鸟求救!关于权限分配问题?
  • sqlserver2000恢复后,如何重新分配用户权限?
  • 如何把目录的写权限分配给用户

关键词

  • 用户
  • 二进制
  • 语句
  • 页面
  • 角色
  • 属性
  • 数据库
  • 权限
  • 过滤器
  • checkadmingroup

得分解答快速导航

  • 帖主:black_flame
  • darkula
  • boneeater
  • darkula
  • darkula

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo