站内搜索: 请输入搜索关键词

当前页面: JAVA 编程资料牛鼻论坛Java & J2SE 技术区→动态Proxy与Java ACL访问控制机制实现(2)

动态Proxy与Java ACL访问控制机制实现(2)

发表新主题   回复此主题

第1楼 2008-01-03 08:16 浮云之子 写道:

动态Proxy与Java ACL访问控制机制实现(2)

  当你在系统中要检验某个用户使用拥有某个权限,如读的权利时,只要acl.checkPermission(user, feature )就可以,acl是ACL的一个实例,这样权限检查就交给java.security.acl.ACL 去处理了。

  有了ACL机制后,我们就可以在我们系统中使用动态Proxy模式来对具体对象或方法进行控制,比如,我们有一个Report类,有些用户可以读,有些用户可以写(哪些用户可以读 哪些用户可以写,已经在上面ACL里部署完成)。

  从Java 1.3开始, Sun提供了Dynamic Proxy API.为了使动态Proxy能够工作,第一你必须有一个Proxy接口,还要有一个继承InvocationHandler的Proxy类。

  在下面的例子中,我们设定有三种用户:普通人;雇员;经理.权限是这样:普通人可以读报告;雇员和经理可以修改报告。

  按通常思维,我们对于读权限,我们设计一个具备读的角色类:

  1.   public interface IpersonRO {
  2.   public String getName();
  3.   public String getAddress();
  4.   public String getPhoneNumber();
  5.   }

  类里面都是读的方法,这是一种粗粒度访问控制,也就是说把读写权限只落实到类(对象)上,这样的话,我们还要为写的角色再建一个类,很显然这不是一个很好的方法,使用动态proxy+acl就可以实现很好的细粒度控制。

  1.   public class ReportProxy implements InvocationHandler
  2.   {
  3.   private Map map;
  4.   public static Object newInstance(Map map,Class[] interfaces)
  5.   {
  6.   return Proxy.newProxyInstance(map.getClass().getClassLoader(), interfaces,new ReportProxy(map));
  7.   }
  8.   public ReportProxy(Map map)
  9.   {
  10.   this.map = map;
  11.   }
  12.   public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
  13.   {
  14.   Object result;
  15.   String methodName = m.getName();
  16.   if (methodName.startsWith("get"))
  17.   {
  18.   if (!acl.checkPermission(user, "read")) return null;
  19.   String name = methodName.substring(
  20.   methodName.indexOf("get")+3);
  21.   return map.get(name);
  22.   }
  23.   else if (methodName.startsWith("set"))
  24.   {
  25.   if (!acl.checkPermission(user, "write")) return null;
  26.   String name = methodName.substring(
  27.   methodName.indexOf("set")+3);
  28.   map.put(name, args[0]);
  29.   return null;
  30.   }
  31.   else if (methodName.startsWith("is"))
  32.   {
  33.   if (!acl.checkPermission(user, "read")) return null;
  34.   String name = methodName.substring(
  35.   methodName.indexOf("is")+2);
  36.   return(map.get(name));
  37.   }
  38.   return null;
  39.   }
  40.   }
上一页 1 2 下一页

第2楼 2013-08-31 12:44 Robot :

动态Proxy与Java ACL访问控制机制实现(2) 相关