动态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类。
在下面的例子中,我们设定有三种用户:普通人;雇员;经理.权限是这样:普通人可以读报告;雇员和经理可以修改报告。
按通常思维,我们对于读权限,我们设计一个具备读的角色类:
- 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;
- }
- }
上一页
1
2
下一页
第2楼 2013-08-31 12:44 Robot :
动态Proxy与Java ACL访问控制机制实现(2) 相关
|