Java安全模型的第四个组成部分就是安全管理器(前三个是类装载器体系结构、class文件校验器以及Java中内置的安全特性)。
它主要用于保护虚拟机的外部资源不被虚拟机运行的恶意或有漏洞的代码侵犯。在运行的Java虚拟机中,它在访问控制——对于外部资源的访问控制——中起中枢作用。
Java安全管理器是Java中的一个类——java.lang.SecurityManager或者其子类的实例传给setSecurityManager(),以此来安装安全管理器,需要手动进行安装,如果没有安装,Java不会给你一个默认的安全管理器。当Java API进行任何可能不安全的操作时,它都会向安全管理器请求许可,从而强制执行自定义的安全策略。要向安全管理器请求许可,Java API将调用安全管理器对象的”check“方法。因为这些方法的名都以”check“开头,所以它们被称为”check“方法。例如,安全管理器的checkRead()方法决定了线程是否可以读取一个特定的文件,checkWrite()方法决定了线程能否对一个特定的文件进行写操作。
1.安装安全管理器
有两种方法来安装安全管理器:一种是直接在代码中实例化安全管理器,调用方法setSecurityManager(new SecurityManager());另一种是在命令行中使用-Djava.security.manager选项来安装管理器。
2.安全策略
制定安全管理器的安全策略也有两种方法:一种是覆盖(override)SecurityManager类中的“checkXXX”方法。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class SecurityManagerTest extends SecurityManager{
@Override
public void checkRead(String arg0) {
// TODO Auto-generated method stub
if(arg0.equals("a.txt")){
throw new SecurityException("不能读取这个文件");
}
}
public static void main(String[] args){
System.setSecurityManager(new SecurityManagerTest());
try{
FileInputStream fis = new FileInputStream("a.txt");
System.out.println(fis.read());
} catch(FileNotFoundException e){
} catch(IOException e){
}
}
}
输出:
Exception in thread "main" java.lang.SecurityException: 不能读取这个文件
at tree.SecurityManagerTest.checkRead(SecurityManagerTest.java:13)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at tree.SecurityManagerTest.main(SecurityManagerTest.java:20)
另一种是利用.policy文件,下面重点讲一下。