??xml version="1.0" encoding="utf-8" standalone="yes"?>欧洲精品在线观看,头脑特工队2免费完整版在线观看,日韩中文字幕一区二区http://www.aygfsteel.com/xiaofeng/category/28465.htmlzh-cnSun, 23 Mar 2008 09:01:25 GMTSun, 23 Mar 2008 09:01:25 GMT608421-权限理pȝhttp://www.aygfsteel.com/xiaofeng/archive/2008/03/22/187891.html傅晓?/dc:creator>傅晓?/author>Sat, 22 Mar 2008 06:15:00 GMThttp://www.aygfsteel.com/xiaofeng/archive/2008/03/22/187891.htmlhttp://www.aygfsteel.com/xiaofeng/comments/187891.htmlhttp://www.aygfsteel.com/xiaofeng/archive/2008/03/22/187891.html#Feedback0http://www.aygfsteel.com/xiaofeng/comments/commentRss/187891.htmlhttp://www.aygfsteel.com/xiaofeng/services/trackbacks/187891.html8421-权限理pȝ

8421权限

前几天看所以到论坛上的朋友问关于权限管理的问题Q勾起了我前些日子做的一?br /> 权限pȝ目的回忆,早就想ؓq个目写点什么了Q一直苦于没有时_今天
偷闲Q上来写点东ѝ由于水qx限,可能我对权限理的设计和理解q存在问
题,原创q篇文章Q也只是起到个抛砖引玉的作用Q大家一h探讨?/p>

在整个权限系l中Q可以分?个概c它们分别是Q组Q角Ԍ成员Q资源,权限
q?个概忉|成了整个权限理pȝQ其中权限是整个pȝ中的最单位?br /> 首先我D个例子帮助大家理解这5个概念,譬如说你公司里一个项目组Q我们可以把
q整个项目组理解成一个组的概念,而项目组里面有不同的角色Q项目经理,目l?br /> 长,技术经理,E序员,每个角色׃同的成员来充当,而其中每个成员又有着不同
的Q务,目l理?#8220;需求分?#8221;q个资源Q程序员?#8220;代码开?#8221;q个资源Q而程序员
q个角色对于“代码开?#8221;q块资源的权限拥有情况又不一P可能有的E序员拥有代
码开发的权限而没有对其他模块代码修改的权限,所以综上所q这几个概念可以L
一张E-R图,但是׃我还没学会脓图,有心无力了。?/p>

在我做这个系l的时候,我首先从角色入手Q由于不同的pȝ对于自己的组Q成员定
义不同,所以如果这套权限系l应用到其他pȝ上去的时候,可能l和成员的管理会
被重新开发,但是基本的角Ԍ资源Q权限的关系是可以应用到每一个部分的?br /> 所以我先完成了角色->资源->权限部分Q由于篇q有限,所以我只说这一重要模块
了?/p>

角色和资源之间属于多对多的关p,卌色可以拥有多个资源,一个资源也可以被多
个角色所拥有。,而每个资源拥有不同的权限Q大多web开发中Q资源的权限都可?br /> 分成5U,dQ删除,修改Q查询,使用Q我们可以首先创Z个基cL定q?U?br /> 权限的唯一标识Q?br /> public class GenericPrivilegeBase
{
       //当判断权限时Q按二进制位与,?则有权限Qؓ0则没权限
       public final static int NO_PRIVILEGE = 0; //0:无权?br />        public final static int QUERY_OR_USE_PRIVILEGE = 1; //1:查看或?br />        public final static int CREATE_PRIVILEGE = 2; //2:创徏
       public final static int DELETE_PRIVILEGE = 4; //4:删除
       public final static int UPDATE_PRIVILEGE = 8; //8:修改
       public final static int ALL_PRIVILEGE = QUERY_OR_USE_PRIVILEGE | CREATE_PRIVILEGE | DELETE_PRIVILEGE | UPDATE_PRIVILEGE;
       //判断是否有权?br />        public static boolean isValidPrivilege(int privilege)
       {
           if ( (privilege & QUERY_OR_USE_PRIVILEGE) != 0)
           {
                   return true;
           }

           if ( (privilege & CREATE_PRIVILEGE) != 0)
           {
                   return true;
           }

           if ( (privilege & DELETE_PRIVILEGE) != 0)
           {
                   return true;
           }

           if ( (privilege & UPDATE_PRIVILEGE) != 0)
           {
                   return true;
           }

           return false;
       }
       //判断是否有查询权?br />        public static boolean checkQueryPrivilege(int privilege)
       {
           if ( (privilege & QUERY_OR_USE_PRIVILEGE) != 0)
           {
                   return true;
           }
           else
           {
                   return false;
           }
       }

       //判断是否有创建权?br />        public static boolean checkCreatePrivilege(int privilege)
       {
           if ( (privilege & CREATE_PRIVILEGE) != 0)
           {
                   return true;
           }
           else
           {
                   return false;
           }
       }

       ......

      //Ҏpȝ名不同而取不同的权限管理表
      public String getResourceTableName()
      {
           return m_system_name + "Resource";
      }

      public String getPrivilegeTableName()
      {
           return m_system_name + "Privilege";
      }

      ......

}
定义完这个权限判别基cdQ我们后台管理类QDAOQ就可以通过l承该类来获得各U?br /> 权限理表,对他q行操作。此Ӟ在页面上Q我们需要对用户资源q行qoQ在web
开发中Q我们通常url看成一U资源。而url对应的页里的各种增删Ҏ操作看成是权
限,所以我们现在所要做的第一步就是进行url的过滤,当一个用L录时Q我们首先要
判定他有哪些资源Q从而断定他是否可以讉K该url。这里,我们可以通过一个过滤器
filter来过滤。下面给资源qo器的部分代码?br />        public void doFilter(ServletRequest request, ServletResponse response,
                            FilterChain filterChain) throws IOException,
           ServletException
       {
           /**@todo Implement this javax.servlet.Filter method*/
           httprequest = (HttpServletRequest) request;
           httpresponse = (HttpServletResponse) response;
           session = httprequest.getSession();
           //获得用户IDQ登录时存取在sessionQ?br />            String user_id = (String) session.getAttribute("UserID");
           if (user_id == null)
               user_id = "0";
//如果在设计数据库时资源表没有设计对应的url字段Q可以将资源对应url关系写到xml?br /> //         XMLAnalyze xml_analyze = new XMLAnalyze(this.resource_path);
//         String res_id = xml_analyze.XMLResourceReader(httprequest.
//               getServletPath());

           Connection conn = DataSourcePool.getDS().getConnection();
           GenericPrivilegeBase user_manager = new GenericPrivilegeBase(conn,
               system_name);

           String sql = "select Privilege,Url from " + user_manager.getRoleMemberTableName();
           sql += " as r ," + user_manager.getPrivilegeTableName() +
               " as p, "+user_manager.getResourceTableName()+" as u where r.MemberID='" + Integer.parseInt(user_id) + "'";
           sql += " and r.RoleID = p.RoleID and p.ResID = u.ResID";

           boolean flag = false;
           String request_url = httprequest.getServletPath();
           if (request_url.indexOf("Action.do") != -1)
           {
               request_url = request_url.replaceAll("Action.do", ".jsp");
               request_url = request_url.toLowerCase();
           }

           try
           {
               Statement stmt = conn.createStatement();
               ResultSet rs = stmt.executeQuery(sql);
               while (rs.next())
               {
                   int privilege = rs.getInt(1);
                   String url_list = rs.getString(2);
                   if(url_list != null)
                   {
                       String[] url = url_list.split(",");
                       for (int i = 0; i < url.length; i++)
                       {
                       //如果权限不ؓ0且请求url包含该用h拥有的资源对应的url
                           if (privilege != 0 && request_url.indexOf(url) !=-1)
                           {
                               flag = true;
                               break;
                           }
                           if (flag)
                               break;
                       }
                   }
               }
               rs.close();
               stmt.close();
               conn.close();
           }
           catch (SQLException ex)
           {
               System.out.println(ex.getMessage());
               if (conn != null)
               {
                   try
                   {
                       conn.close();
                   }
                   catch (Exception e)
                   {}
               }
           }

           boolean find = false;
           //除去不需要进行资源过滤的urlQ如login.jsp{?br />            if (this.special != null)
           {
               String[] except_page = this.special.split(",");
               if (except_page.length >= 0)
               {
                   for (int i = 0; i < except_page.length; i++)
                   {
                       if (request_url.indexOf(except_page) >= 0)
                       {
                           find = true;
                           break;
                       }
                   }
               }
           }
           if (!find)
           {
               if (!flag || user_id == null || user_id.trim().length() <= 0)
               {
                   httprequest.getRequestDispatcher(this.error_page).forward(httprequest,httpresponse);
               }
               else
               {
                   filterChain.doFilter(httprequest, httpresponse);
               }
           }
           else
           {
               filterChain.doFilter(httprequest, httpresponse);
           }
       }
通过q个qo器,我们完成了资源的qoQ从此我们不必再d心用戯否访问某?br /> urlQ资源)Q接下来的我们需要解决的问题是是如何在页面里面有效的控制增加
Q删除等q些权限Q这可以通过两个办法来控制?br /> W一个办法,是在用L录的时?br /> 我们该用户所有的资源都取出来攑օ一个容器内Q每ơ遇到需要权限判定的地方将
q个容器里的内容循环Q看看是否有该权限?br /> W二个办法是通过一个自定义的标{来控制。只要向自定义的标签内传入用户id和系l?br /> 名就可以了,q种标签自然是应该成对的Q包括有此权限的标签和无此权限的标签Q类
?lt;logic:present>?lt;logic:notPresent>标签Q具体的自定义标{我书写如下Q?br /> <page:privilege beanName="InitBean" scope="session" operation="UPDATE">
         <html:link href="modifyRoleAction.do" paramId="roleid" paramName="role" paramProperty="m_role_id">修改</html:link>
</page:privilege>
q段标签的意思是Q如果取InitBeanq个javabean中的属性字Duserid为当前用P?br /> 用户在本urlQ本url是一个资源)Q如果有UPDATE权限Q那执行标{ֆbody部分?br /> 链接代码Qhtml:linkQ?br /> 与此标签对应的标{֦下:
<page:notPrivilege beanName="InitBean" scope="session" operation="UPDATE">
         <html:link href="modifyRoleAction.do" paramId="roleid" paramName="role" paramProperty="m_role_id">修改</html:link>
</page:notPrivilege>
我给Z部分该标{代码Q?br />        public int doStartTag() throws JspTagException
       {
           int userID = 0;
           String systemName = "";
           if (scope == null || scope.equals(""))
               return SKIP_BODY;
           else
           {
               if (scope.equalsIgnoreCase("session"))
               {
                   HttpSession session = pageContext.getSession();
                   LoginForm init_bean = (LoginForm)session.getAttribute("InitBean");
                   if (init_bean == null)
                       return SKIP_BODY;
                   String user_id = init_bean.getUserid();//得到用户id
                   systemName = init_bean.getSystem_name();
                   try
                   {
                       userID = Integer.parseInt(user_id);
                   }
                   catch (NumberFormatException ex1)
                   {
                   }
               }
               else
               if (scope.equalsIgnoreCase("request"))
               {
                   HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
                   LoginForm init_bean = (LoginForm)request.getAttribute("InitBean");
                   if (init_bean == null)
                       return SKIP_BODY;
                   String user_id = init_bean.getUserid();
                   systemName = init_bean.getSystem_name();
                   try
                   {
                       userID = Integer.parseInt(user_id);
                   }
                   catch (NumberFormatException ex1)
                   {
                   }
               }
           }

           Connection conn = DataSourcePool.getDS().getConnection();
           if (conn == null || systemName == null || operation == null)
               return SKIP_BODY;
           GenericPrivilegeBase user_manager = new GenericPrivilegeBase(conn,
               systemName);
           HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
           String resource_path = request.getServletPath();//得到本页资源url

           String sql = "select Privilege,Url from " + user_manager.getRoleMemberTableName();
           sql += " as r ," + user_manager.getPrivilegeTableName() +
               " as p, "+user_manager.getResourceTableName()+" as u where r.MemberID='" + userID + "'";
           sql += " and r.RoleID = p.RoleID and p.ResID = u.ResID";
           int privilege = 0;
           try
           {
               Statement stmt = conn.createStatement();
               ResultSet rs = stmt.executeQuery(sql);
               while (rs.next())
               {
                   privilege = rs.getInt(1);
                   String url_list = rs.getString(2);
                   if(url_list != null)
                   {
                       String[] url = url_list.split(",");
                       for (int i = 0; i < url.length; i++)
                       {
                       //如果权限不ؓ0且请求url包含该用h拥有的资源对应的url
                           if (privilege != 0 && request_url.indexOf(url) !=-1)
                           {
                               flag = true;
                               break;
                           }
                           if (flag)
                               break;
                       }
                   }
               }
               rs.close();
               stmt.close();
               conn.close();
           }
           catch (SQLException ex)
           {
               System.out.println(ex.getMessage());
               if (conn != null)
               {
                   try
                   {
                       conn.close();
                   }
                   catch (Exception e)
                   {}
               }
               return SKIP_BODY;
           }
           if (operation.equals("NONE"))
               return EVAL_BODY_TAG;
           if (operation.equals("QUERY"))//如果需要判定是否具有查?br />                if (user_manager.checkQueryPrivilege(privilege))//如果h查询权限
                   return EVAL_BODY_TAG;
           if (operation.equals("CREATE"))
               if (user_manager.checkCreatePrivilege(privilege))
                   return EVAL_BODY_TAG;
           if (operation.equals("DELETE"))
               if (user_manager.checkDeletePrivilege(privilege))
                   return EVAL_BODY_TAG;
           if (operation.equals("UPDATE"))
               if (user_manager.checkUpdatePrivilege(privilege))
                   return EVAL_BODY_TAG;
           if (operation.equals("USE"))
               if (user_manager.checkUsePrivilege(privilege))
                   return EVAL_BODY_TAG;
           return SKIP_BODY;
       }
通过q两个标{ְ可以判定面上的所有权限了?/p>

在以上的说明和代码里面,我们Ҏ限的控制主要是通过4个二q制位与来获得,他们
分别?Q?Q?Q?Q这四位二进制位分别代表?U权限,我们在工E的开始就他?br /> 写入一个基c,q样后面判定权限的时候都引用了这个基c里面的判定函数?br />



]]>
07q个人ȝhttp://www.aygfsteel.com/xiaofeng/archive/2007/12/31/171785.html傅晓?/dc:creator>傅晓?/author>Sun, 30 Dec 2007 16:31:00 GMThttp://www.aygfsteel.com/xiaofeng/archive/2007/12/31/171785.htmlhttp://www.aygfsteel.com/xiaofeng/comments/171785.htmlhttp://www.aygfsteel.com/xiaofeng/archive/2007/12/31/171785.html#Feedback0http://www.aygfsteel.com/xiaofeng/comments/commentRss/171785.htmlhttp://www.aygfsteel.com/xiaofeng/services/trackbacks/171785.html         整体来说Q?7q是自己很奇q般的一q_收获了太多太多东ѝ?br />         一、学业上
        07q毕业了Q幸q地考上研究生,可以接着做自q学生梦?br />         上研几个月后Q受到导师重视(哈,本科时就跟他混了很长旉Q这是当然的啦)Q派d京参加全国比赛和一个专业会议,收获真不是一般的大,不仅看到了许多优U的作品(参加比赛Q其实自q东西也是很不错的Q可惜只拿了全国二等Q第一ơ参加,q不错啦Q呵Q,而且q看C全国范围内,本专业在各个大学其是名校的发展状况Q看C许多优秀博士生的论文。(有博士点的确实就比我们这没博士点的横Q在感受到差距的同时Q也看到了国内研I的前沿方向Q不错不错)d京,大大长了见识Q抽IL华北大好好{了{Q更看到了微软、GOOGLE、百度、SINA{的写字|呵呵Q梦想中的地斏V?br />         关于学业上,也开始了更多的思考,不过因ؓ自己数学基础的问题,好些东西q是没法深入学习下去Q基啊,唉,关于人工在教育上的应用,q个方向已经是热点了Q除了少数几个学校还能做出来一两个不是很成熟的作品Q大部分的h都是在理Z拓展Q所以应该抓住机会啊Q再M攅R?br />         二、关于JAVA
        回到了以前兼职的公司Q没办法Q没别的地方Ӟ不仅扑֛了编E的感觉Q编E的快乐Q在来多的实践中Q又学到了很多新的知识,比如QSpring+Hibernate+StrutsQ还有AjaxQ短短的半年Q目光看的更q了Q虽然这些框架还不是非常熟悉Q但是已l开始了Q算是一个突破?br />         后来因ؓ学校开招聘会,又去了两北京,参加北京中Y国际的笔试和面试Q虽然交?40块钱Q但是却做了真正大公司的W试题,听了两场大开眼界的讲座,以及亲历了一ơ面试,收获了许多信心,自己q不W,呵呵。这p的真值啊?br />         关于~程上,有幸听到看到学到那么多的新观点和新知识,首先Q看了看大公司的实质Q虽然中软确实有炚wQ学生交钱来参加培训Q还免费l干z,培训期满扑ַ作也没准Q找的工作也不好Q但是做讲的项目经理马上就l了我很多的感想Q跨q_的JAVAQ跨语言?NETQ高端的SOAQ面向服务的思想Q团队合作的要点Q项目管理的程Q让我各个方面都开始了思考,甚至到处理v量数据时应该采取何种解决ҎQ至接触到了很多很多的新思想Q这是不错的开端啊?br />         三、个人感情,生活目标
        一下子从Qw的状态拉了回来,感情上,和老婆亲亲密密Q这一份简单纯真的爱情Q让我的生活滋润了很多很多。也感谢老婆在我每每发愁时帮我走Z谗生zȝ标嘛Q还是以我们俩ؓ中心Q慢慢地铺展开Q不一L是,开始从很短期,天天看着房h发愁开始去规划自己的长期,到底要做什么,到底要实C么,到底惌一个什么样的生z,慢慢的,已经能给自己{案Q慢慢的Q也不再否进入一个大公司而烦|扑ֈ最合适自q地方是最重要的,而不在于公司的大?br />         生活上,慢慢来,自己需要时间?br />         四、不?br />         什么都不可能完,即我这一q已l获得了非常大的H破?br />         不完的原因q是因ؓ自己Q很大的两个问题Q?br />         一、执行力
        二、管?br />         自己很多很好的想法,是没有d行,贪玩如此Q誓Lq?br />         理Q虽然自己是个小力巴Q但是也涉及C际和理Q无奈的发现Q还是做得很不好Q可能是一直面对电脑的关系Q希望能多学习积累一些管理上的经验?br />
        呵呵Qȝ到此吧,其实要写的,如果想细化,q有很多很多Q希望能把自己更多的东西沉淀下来Q?7q_我真的获得了很多财富Q由此,?8q充满了信心?

]]>
վ֩ģ壺 Ʊ| | | | ǰ| | ½| ͨ| | ͨ| ʡ| | | ٤ʦ| ¡| | | Ϲ| ׯ| | | Դ| Դ| | ʷ| Ϣ| | | | | ̨| | | ĺ| | ຣʡ| Ӷ| | ʳ| | |