JiveJdon Community Forums
在线293人   首页   主题总表   培训咨询   精华   查搜   注册    登陆
首页 » 论坛 » 项目工程开发经验谈
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 13 回复 / 1
 发表新帖子   回复该主题贴
banq

悄悄话
发表文章: 9315
注册时间: 2002年08月03日 17:08
使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月07日 08:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表 权限(92)      proxy模式(9)      aop(27)     
用户访问控制(Access control )机制总是围绕粗粒度和细粒度两个方面来讨论:

粗粒度控制:可以规定访问整个对象或对象群的某个层,而细粒度控制则总是在方法或属性层进行控制,比如:

允许一个文件为只读是属于粗粒度控制,而允许对这个文件某行有写操作则属于细粒度控制。

一个好的用户控制机制当然既允许粗粒度也允许细粒度控制,在Jive中我们看到是使用Proxy来达到这个目的,
但是我们也发现,由于需要对每个类都要进行细粒度控制,所以必然对每个类都要做一个Proxy类,这样带来了很多Proxy类,如ForumProxy ForumThreadProxy ForumFactoryProxy等,无形增加了系统复杂性。

使用动态Proxy可以很好的解决这个问题。再结合java.security.acl的ACL机制,我们就可以灵活地实现粗粒度和细粒度的双重控制。



当一个用户login后,我们就要在内存中为其建立相应的授权访问机制,使用java.security.acl可以很方便的建立这样一个安全系统。

首先任何一个对象都应该有个基本属性:拥有者 或拥有者所属组(Windows中每个目录安全描述符都由4部分构成:对象的创建者、对象所属的组、自由存取控制和系统存取控制)。

1. Java acl开始第一步是建立一个主体 Principal,其中SecurityOwner是主体的拥有者:

private static final Principal _securityOwner = new PrincipalImpl("SecurityOwner");

2. 当用户login进来时,他带有两个基本数据:访问密码和他要访问的对象ApplicationName。首先验证用户名和密码,然后从数据库中取出其权限数据,建立Permission,这里使用Feature继承了Permission,在Feature中定义了有关权限的细节数据(如读 写 删)。

// 取出用户和被访问对象之间的权限关系,这种权限关系可能不只一个,也就是说,用户
//可能对被访问对象拥有读 写 删等多个权限,将其打包在Hasbtable中。
Hashtable features = loadFeaturesForUser(sApplicationName, sUserID);

3. 创建一个用户对象
User user = new UserImpl(sUserID, new Hashtable() );

4. 为这个用户创建一个活动的acl entry
addAclEntry( user, features);


其中最关键的是第四步addAclEntry,我们看看其如何实现的:

// 为这个用户创建一个新的Acl entry
AclEntry newAclEntry = new AclEntryImpl( user);

//遍历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
{
Object result;
String methodName = m.getName();
if (methodName.startsWith("get"))
{
if (!acl.checkPermission(user, "read")) return null;
String name = methodName.substring(
methodName.indexOf("get")+3);
return map.get(name);
}
else if (methodName.startsWith("set"))
{
if (!acl.checkPermission(user, "write")) return null;
String name = methodName.substring(
methodName.indexOf("set")+3);
map.put(name, args[0]);
return null;
}
else if (methodName.startsWith("is"))
{
if (!acl.checkPermission(user, "read")) return null;
String name = methodName.substring(
methodName.indexOf("is")+2);
return(map.get(name));
}
return null;
}
}
banq

悄悄话
发表文章: 9315
注册时间: 2002年08月03日 17:08
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月07日 17:11 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
该原理可以应用到很多:
信息的读、写、执行、拷贝、打印、查询、修改、新增、删除,例如某用户只能在某时间以前运行某模块或功能,某业务员只能看到金额小于某值或某时段内的订单。

电子政务中级别控制严谨的等级系统,如某部门可以修改发布某些信息,某部门内某人有哪些特殊权利等等。
cc

悄悄话
发表文章: 279
注册时间: 2002年08月07日 23:47
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月08日 09:05 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
能不能讲讲java.security.acl这个类是干什么的?怎么使用的?
banq

悄悄话
发表文章: 9315
注册时间: 2002年08月03日 17:08
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月08日 17:18 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
相关文挡不多,我说不出多少,等我再研究研究,不知道其他人知道不?

几天不见,你们又冒出来了,真开心。
cc

悄悄话
发表文章: 279
注册时间: 2002年08月07日 23:47
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月08日 18:12 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
其实放假我也天天来的,只是不在单位,没有思想看帖子,只是大概的浏览一下.现在又像雨后春笋...哈哈哈
wait4friend

悄悄话
发表文章: 37
注册时间: 2002年08月22日 09:35
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月10日 11:24 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
斑竹,能不能提供一点和“动态Proxy和Java ACL”相关的文档,介绍资料?
banq

悄悄话
发表文章: 9315
注册时间: 2002年08月03日 17:08
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月10日 12:13 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
相关资料很少,大概是涉及安全保密巴,呵呵
有谁知道更多资料?
zhongjin

悄悄话
发表文章: 1
注册时间: 2002年10月14日 09:10
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月21日 08:25 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
版主,能不能给个完整的例子 谢谢了
svenwang

悄悄话
发表文章: 1
注册时间: 2002年10月21日 23:36
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2002年10月21日 23:40 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
原文例子中类/方法通过方法名映射到一个权限的方法,我也使用过,感觉非常的。。。难受。也许使用XML部署这种映射关系会好一些吧。
baxp

悄悄话
发表文章: 1
注册时间: 2003年02月13日 11:52
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2003年02月13日 11:57 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
请问斑竹一下
如果有一个类,所有人多可以创建并且得到该类的实例
class a{
public void method1(){}
public void method1(){}
}
其中user1 只能用method1,user2 只能用method2
那么我怎么才能通过代理控制住方法的访问呢?
因为proxyobject的invoke方法中,并没有执行该方法的用户的信息
可以说,proxyobject并不知道当前当前是那个用户在执行方法
kkkk

悄悄话
发表文章: 3
注册时间: 2003年04月22日 13:50
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2003年04月22日 15:02 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
例子不是很完整,希望斑竹能提供多一点详细例子。
谢谢!
newroc

悄悄话
发表文章: 3
注册时间: 2003年06月19日 22:01
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2003年06月19日 23:33 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
斑竹能说一下ACL和JAAS的关系吗,好像前者是比较老的安全控制机制把,了解的不多希望大家指教
托天

悄悄话
发表文章: 1
注册时间: 2005年06月28日 10:44
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2005年06月28日 10:45 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
急需这方面的内容,有什么书可以看看的,网上的资料太少!
banq

悄悄话
发表文章: 9315
注册时间: 2002年08月03日 17:08
Re: 使用动态Proxy和Java ACL进行用户访问控制机制实现 2005年07月01日 19:00 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
现在已经使用AOP技术来实现了,具体可参考JBoss源码。目前可用性延伸出两种方向:基于J2EE容器的安全认证;基于AOP拦截器的安全认证。
参考文献:http://www.jdon.com/idea/jaas/06003.htm
这个主题有 13 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
 

手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com
anti spam