沙箱的实现包括三个方面:
1,安全管理器
2,存取控制器
3,类装载器
我们首先看看安全管理器:
一,安全管理器的作用
确定能否执行某项操作。在默认沙箱一章中介绍了策略文件,策略文件中所有的策略都是有安全管理器负责管理的。
注意:
java2之后,存取控制器出现,作用和安全管理器一样,导致目前存取控制器和安全控制器并存。作者认为,存取控制器出现是对安全管理器的补充和完善,java1.1中并没有策略文件,安全管理器的内部逻辑经常会改动才能满足实际的安全需要,存取控制器让安全配置转移到了策略文件,因此存取控制器让安全配置更为灵活(更用户化了!)。
另外,如果你的应用没有java1.1代码,那么存取控制器可以取代安全管理器。
二,安全管理器和JAVA API
java.lang.SecurityManager为其他java api提供了接口。
我们可以认为安全管理器是java api和资源之间的中间机构。
例子,FileInputStream 流对象构造代码
public FileInputStream(String name) throws FileNotFoundException{
SecurityManager security = System.getSecurityManager();
if(security!=null){
security.checkRead(name);
}
try{
open(name);
}catch(IOException e){throw FileNotFoundException(name)}
}
FileInputStream是一个JAVA API,实例化时(创建文件流时)总是询问:
---系统是否启用了安全管理器?
---如果启用,判断是否能建立文件流?
我们可以看出,安全管理器就是一个保护资源的界面,如果启用,api就只能先通过他的权限策略验证后,才能获取到资源
三、安全管理器的操作
在system中,只有一个安全管理器,我们可以设置或获取系统的安全管理器
SecurityManager sm = System.getSecurityManager();
System.setSecurityManager(sm);
安全管理器的方法请参考api文档,方法与java的权限是对应的
1,我们自定义的类一样可以利用安全管理器;java核心API总是会访问安全管理器
2,我们可以修改或添加策略和文件,我们很难重载安全管理器
3,安全管理器是唯一的,所有的方法都是静态的