background image

 
//遍历 Hashtable features,将其中多种权限加入:

  ....
  feature = (Feature) hFeatures.get(keyName);
  newAclEntry.addPermission( feature );
  ....

  最后也要加入主体拥有者 SecurityOwner
  这样一个安全体系就已经建立完成。
    当 你 在 系 统 中 要 检 验 某 个 用 户 使 用 拥 有 某 个 权 限 , 如 读 的 权 利 时 , 只 要
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 类。
  在下面的例子中,我们设定有三种用户:普通人;雇员;经理.权限是这样:普通人可
以读报告;雇员和经理可以修改报告。
  按通常思维,我们对于读权限,我们设计一个具备读的角色类:
  public interface IpersonRO {
  public String getName();
  public String getAddress();
  public String getPhoneNumber();
  }

  类里面都是读的方法,这是一种粗粒度访问控制,也就是说把读写权限只落实到类
(对象)上,这样的话,我们还要为写的角色再建一个类,很显然这不是一个很好的方法,
使用动态 proxy+acl 就可以实现很好的细粒度控制。
  public class ReportProxy implements InvocationHandler
  {
  private Map map;
  public static Object newInstance(Map map,Class[] interfaces)
  {
 

 

return   Proxy.newProxyInstance(map.getClass().getClassLoader(),   interfaces,new 

ReportProxy(map));
  }
  public ReportProxy(Map map)
  {
  this.map = map;
  }
  public Object invoke(Object proxy, Method m, Object[] args) throws Throwable