IBMSOFT

ibmsoft 努力不一定成功,放弃一定失败! 坚持自己的理想,实现自己的目标! 有好的想法就要出想办法实现!

BlogJava 首页 新随笔 联系 聚合 管理
  8 Posts :: 2 Stories :: 3 Comments :: 0 Trackbacks

2007年3月3日 #

http://www.blogjava.net/youxia/archive/2007/03/01/101320.html
posted @ 2007-03-05 23:40 ibmsoft 阅读(88) | 评论 (0)编辑 收藏

http://forum.springside.org.cn/viewthread.php?tid=927&highlight=%E6%9D%83%E9%99%90
简单实用一分钟上手级权限控制

找回来自己以前的一个项目, 用的是通过filter过滤来管理权限的方法, 很简单,但也很实用。 这个项目并不小,但这么一个类就已经可以满足其权限管理的需要了,所以其实很多时候,权限管理大家并不必要想得那么复杂, 对于不少系统,简单通过filter来管理就ok了, simple 也是一种美^_^ 在web.xml里加入

  1. <!--================权限 设置================-->  
  2. <filter>  
  3.     <filter-name>Authentication</filter-name>  
  4.     <filter-class>com.springside.demo.security.UrlFilter</filter-class>  
  5.     <init-param>  
  6.         <param-name>onError</param-name>  
  7.         <param-value>/login.jsp</param-value>  
  8.     </init-param>  
  9. </filter>  
  10. <filter-mapping>  
  11.     <filter-name>Authentication</filter-name>  
  12.     <!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->  
  13.     <url-pattern>*.jsp</url-pattern>  
  14. </filter-mapping>  

 

UrlFilter filter类的实现

  1. public class UrlFilter implements Filter {  
  2.     private FilterConfig filterConfig;  
  3.   
  4.     private FilterChain chain;  
  5.   
  6.     private HttpServletRequest request;  
  7.   
  8.     private HttpServletResponse response;  
  9.   
  10.     public void destroy() {  
  11.         this.filterConfig = null;  
  12.     }  
  13.   
  14.     public void init(FilterConfig filterConfig) throws ServletException {  
  15.         this.filterConfig = filterConfig;  
  16.     }  
  17.   
  18.     public void doFilter(ServletRequest servletRequest,  
  19.             ServletResponse servletResponse, FilterChain chain)  
  20.             throws IOException, ServletException {  
  21.         this.chain = chain;  
  22.         this.request = (HttpServletRequest) servletRequest;  
  23.         this.response = ((HttpServletResponse) servletResponse);  
  24.   
  25.         String url = request.getServletPath();  
  26.         if (url == null)  
  27.             url = "";  
  28.   
  29.         // 获取session中的loginuser对象  
  30.         HttpSession session = request.getSession();  
  31.         LoginUser loginuser = (LoginUser) session.getAttribute("loginuser");  
  32.   
  33.         if (baseUrl(url, request)) {  
  34.             // 如果是登陆界面等无须<u><b><font color="#FF0000">权限</font></b></u>访问的的公用界面则跳过  
  35.             chain.doFilter(request, response);  
  36.         } else if (loginuser == null) {  
  37.             checkLogin(url);  
  38.         } else {  
  39.             verifyUrl(url, loginuser);  
  40.         }  
  41.     }  
  42.   
  43.     private void checkLogin(String url) throws ServletException, IOException {  
  44.         // 如果session中获取不到 loginuser 对象,要不就是session 过期了,要不就是还没登陆。所以返回登陆界面  
  45.         // 在登陆后记得把 loginuser 对象置于 session中  
  46.   
  47.         if (url.indexOf("/index.jsp") >= 0  
  48.                 && "login".equals(request.getParameter("act"))) {  
  49.             // 获取request中username,password  
  50.             String username = request.getParameter("username");  
  51.             String password = request.getParameter("password");  
  52.             UserDao userDao = new UserDao();  
  53.             if (userDao.authUser(username, password)) {  
  54.                 LoginUser user = userDao.getUser(username);  
  55.                 request.getSession().setAttribute("loginuser", user);  
  56.                 verifyUrl(url,user);  
  57.                 return;  
  58.             }  
  59.         }  
  60.         response.sendRedirect("login.jsp");  
  61.     }  
  62.   
  63.     private void verifyUrl(String url, LoginUser loginuser)  
  64.             throws IOException, ServletException {  
  65.         // 获取 loginuser 拥有的所有资源串  
  66.         Set royurl = loginuser.getResStrings();  
  67.         if (royurl != null && royurl.size() > 0 && pass(royurl, url, request.getParameterMap())) {  
  68.             chain.doFilter(request, response);  
  69.         } else {  
  70.             response.setContentType("text/html;charset=GBK");  
  71.             response  
  72.                     .getWriter()  
  73.                     .println(  
  74.                             "<div style='margin: 100 auto;text-align: center;"  
  75.                                     + "font: bold 18px 宋体;color: #0066CC;vertical-align: middle'> Sorry,您没有<u><b><font color="#FF0000">权限</font></b></u>访问该资源!</div>");  
  76.         }  
  77.     }  
  78.   
  79.     /** 
  80.      * 判断是否是公用界面 
  81.      */  
  82.     protected boolean baseUrl(String url, HttpServletRequest request) {  
  83.         if (url.indexOf("/login.jsp") >= 0) {  
  84.             return true;  
  85.         }  
  86.         return false;  
  87.     }  
  88.   
  89.     /** 
  90.      * 判断该用户是否有权请求该url 
  91.      *  
  92.      * @param royurl 
  93.      *            user拥有的授权的的url串集合 
  94.      * @param url 
  95.      *            当前请求的url 
  96.      * @param reqmap 
  97.      *            当前request的参数 
  98.      * @return 是否通过该url 
  99.      */  
  100.     protected boolean pass(Set royurl, String url, Map reqmap) {  
  101.         boolean match = true;  
  102.         for (Iterator iter = royurl.iterator(); iter.hasNext();) {  
  103.             // 获取资源  
  104.             match = true;  
  105.             String res_string = (String) iter.next();  
  106.             if (res_string.indexOf("*") > 0) {  
  107.                 res_string = res_string.substring(0, res_string.indexOf("*"));  
  108.                 if (url.substring(0, res_string.length()).equalsIgnoreCase(  
  109.                         res_string)) {  
  110.                     return true// 增加通配符比较  
  111.                 }  
  112.             }  
  113.             // 分割url与参数  
  114.             String[] spw = res_string.split("\\?"); // 用"\\?" 转义后即可得到正确的结  
  115.             if (!url.equalsIgnoreCase(spw[0])) {  
  116.                 match = false;  
  117.             }  
  118.             if (match && spw.length > 1) {  
  119.                 String[] spa = spw[1].split("\\&"); // 分拆各参数  
  120.                 for (int j = 0; j < spa.length; j++) {  
  121.                     String[] spe = spa[j].split("="); // 分拆键与值  
  122.                     String key = spe[0];  
  123.                     String value = "";  
  124.                     if (spe.length > 1) {  
  125.                         value = spe[1].trim();  
  126.                     }  
  127.   
  128.                     // 轮询  
  129.                     String[] values = (String[]) reqmap.get(key);  
  130.                     if (values != null) {  
  131.                         for (int k = 0; k < values.length; k++) {  
  132.                             if (value.equalsIgnoreCase(values[k])) {  
  133.                                 match = true;  
  134.                                 break;  
  135.                             }  
  136.                             match = false;  
  137.                         }  
  138.                         if (!match) {  
  139.                             break;  
  140.                         }  
  141.                     }  
  142.                 }  
  143.   
  144.             }  
  145.   
  146.             if (match) {  
  147.                 break;  
  148.             }  
  149.         }  
  150.         return match;  
  151.     }  
  152.   
  153.     public static void main(String[] args) {  
  154.         UrlFilter filter = new UrlFilter();  
  155.         String url = "/baseProd/product.do";  
  156.   
  157.         Map reqmap = new HashMap();  
  158.         // 当前请求productline参数是11,12  
  159.         reqmap.put("productline"new String[] { "11""12" });  
  160.   
  161.         String str;  
  162.         Set royurl = new HashSet();  
  163.   
  164.         // 和授权的的url根本不同,false  
  165.         royurl.add("/user.do?a=1&b=2");  
  166.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  167.         // 授权的请求参数13,14时 false  
  168.         royurl.add("/baseProd/product.do?productline=13&productline=14");  
  169.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  170.         // 授权的请求参数11,13时 false  
  171.         royurl.add("/baseProd/product.do?productline=11&productline=13");  
  172.         System.out.println("match false:" + filter.pass(royurl, url, reqmap));  
  173.   
  174.         // 授权的请求参数11时 true  
  175.         royurl.add("/baseProd/product.do?productline=11");  
  176.         System.out.println("match true:" + filter.pass(royurl, url, reqmap));  
  177.   
  178.         // 参数的不论顺序 true  
  179.         royurl.add("/baseProd/product.do?productline=12&productline=11");  
  180.         System.out.println("match true:" + filter.pass(royurl, url, reqmap));  
  181.   
  182.         royurl.clear();  
  183.         // 支持 "*" 号作通配符 true  
  184.         royurl.add("/baseProd/product.do*");  
  185.         System.out.println("match ture:" + filter.pass(royurl, url, reqmap));  
  186.   
  187.     }  
  188.   
  189. }  
LoginUser 类:
  1. public class LoginUser {  
  2.     private String name;  
  3.       
  4.     //用户的授权url集合,如"/product.do?line=1&singer=2","/menu.do?son=1&son=2&son=3","/job.do*"  
  5.     private Set resStrings;  
  6.   
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.   
  11.     public void setName(String name) {  
  12.         this.name = name;  
  13.     }  
  14.   
  15.     public Set getResStrings() {  
  16.         return resStrings;  
  17.     }  
  18.   
  19.     public void setResStrings(Set resStrings) {  
  20.         this.resStrings = resStrings;  
  21.     }  
  22.       
  23.       


posted @ 2007-03-05 23:38 ibmsoft 阅读(247) | 评论 (0)编辑 收藏

http://blog.chinaunix.net/u/11262/showart_213703.html
http://wiki.springside.org.cn/display/springside/Acegi+Reference

RBAC初学笔记

什么是RBAC

RBAC就是Role-Based Access Control,基于角色的访问控制。角色访问控制(RBAC)引入了Role的概念,目的是为了隔离User(即动作主体,Subject)Privilege(权限,表示对Resource的一个操作,即Operation+Resource)更符合企业的用户、组织、数据和应用特征。

RBAC的关注点在于RoleuserRoleprivilege的关系,也就是User AssignmentPermission Assignment的关系。

RBAC有以下优点:

1减少授权管理的复杂性,降低管理开销
  2灵活的支持企业的安全策略,对企业的变化有很大的伸缩性

 

解决复杂的权限管理问题的过程可以抽象概括为:判断【Who是否可以对What进行How的访问操作(Operator】这个逻辑表达式的值是否为True的求解过程。

RBAC中的几个重要概念:

l         Who权限的拥有者或主体。典型的有PrincipalUserGroupRoleActor等等。跟授权有关系的实体就只有角色(Role)和用户(User)。譬如:业务经理(Role),张三(User

Role作为一个用户(User)与权限(Privilege)的代理层,解耦了权限和用户的关系,所有的授权应该给予Role而不是直接给UserGroup。基于角色的访问控制方法的思想就是把对用户的授权分成两部份,用角色来充当用户行驶权限的中介。角色是一组访问权限的集合,一个用户可以是很多角色的成员,一个角色也可以有很多个权限,而一个权限也可以重复配置于多个角色。

User用户就是一个可以独立访问计算机系统中的数据或者用数据表示的其它资源的主体,我们用USERS表示一个用户集合。用户在一般情况下是指人。

Group:是一组相关user的集合。Usergroup继承出来,也就具有了该group的角色权限。

个人觉得可以这么认为,role是抽象化了的usergroup

l         What权限针对的资源(Resource)(包括资源类别(the type of Resource)和资源实例(the instance of Resource))。譬如:报表。

粗粒度:表示类别级,即仅考虑对象的类别(the type of object),不考虑对象的某个特定实例。比如,用户管理中,创建、删除,对所有的用户都一视同仁,并不区分操作的具体对象实例。

细粒度:表示实例级,即需要考虑具体对象的实例(the instance of object),当然,细粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比如,合同管理中,列表、删除,需要区分该合同实例是否为当前用户所创建。

l         How亦作action,表示某种访问方法(亦请参考Operator条目解释)。譬如:删除。

l  Operator操作。表示施加于WhatHow动作。是一种Resource Related的概念,单独的How动作是没有实际意义的,譬如:删除;只有与具体资源结合在一起才有意义,譬如:删除报表。

下面的图展示了user,group,role,how的关系

 

权限系统的核心由以下三部分构成:

1.      创造权限

2.       分配权限

3.       使用权限

 

系统各部分的主要参与者对照如下:

1.创造权限 - Programer创造,

2.分配权限 - Administrator 分配,

3.使用权限– User

 

 
  1. Programer 向权限系统提供 Operator = Privilege + Resource
  2. Administrator 利用 Operator 这个基本元素,来创造他理想中的权限模型。
    如,创建角色,创建用户组,给用户组分配用户,将用户组与角色关联等等...
    这些操作都是由 Administrator 来完成的.
  3. User 使用 Administrator 分配给的权限去使用各个系统。
程序员只要回答一个问题,就是, 什么权限可以访问什么资源,也就是前面说的 Operator。程序员提供 Operator 就意味着给系统穿上了盔甲。Administrator 就可以按照他的意愿来建立他所希望的权限框架。Operator是这个系统中最关键的部分,它是一个纽带,一个系在ProgrammerAdministratorUser之间的纽带。
posted @ 2007-03-05 23:10 ibmsoft 阅读(215) | 评论 (0)编辑 收藏

http://www.pagebreeze.com/
posted @ 2007-03-03 16:27 ibmsoft 阅读(789) | 评论 (2)编辑 收藏