13.3.5 守卫对象

通过传递AccessControlContext类的对象可以在其他线程中通过当前线程的访问控制上下文信息进行权限检查。在有些情况下,可能传递AccessControlContext类的对象不是一个可以接受的选择,这时可以使用java.security.GuardedObject类和java.security.Guard接口。在创建GuardedObject类的对象时需要提供另外一个被保护的对象,以及保护该对象的Guard接口的实现对象。GuardedObject类的对象的使用者可以通过getObject方法来获取这个被保护的对象,前提是对应的Guard接口的实现对象的checkGuard方法可以成功完成。Permission类实现了Guard接口,可以很方便地作为判断条件来使用。代码清单13-14给出了GuardedObject类和Guard接口的使用示例—把一个FilePermission类的对象作为GuardedObject类的对象使用的判断条件。如果getObject方法的调用者具有相应的权限,则getObject方法可以正确返回被保护的对象。

代码清单13-14 GuardedObject类和Guard接口的使用示例


public GuardedObject readFile(Path path)throws IOException{

FilePermission permission=new FilePermission(path.toString(),"read");

byte[]data=Files.readAllBytes(path);

GuardedObject guardedObj=new GuardedObject(data, permission);

return guardedObj;

}

public void useFile(Path path)throws IOException{

GuardedObject guardedObj=readFile(path);

byte[]data=(byte[])guardedObj.getObject();

}