0 Java安全模型图,和 策略与权限关系:
上图可知, 策略文件和安全管理器需要一起合作才能实现安全管理功能, 策略文件里面的内容的多少决定操作权限的多寡。
1 介绍策略文件:
做一个简单demo, 感受下策略文件相对于权限控制:
第一步,定义一个简单类。
import java.io.FileWriter;
import java.io.IOException;
public class TestPolicy {
public static void main(String[] args) {
FileWriter writer;
try {
writer = new FileWriter("d:/testPolicy.txt");
writer.write("hello1");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
第二步,定义一个简单的策略文件,我们放到工程的类路径下(src文件夹里),名字为myPolicy.txt
grant codeBase "file:D:/workspace/TestPolicy/bin/*" {
permission java.io.FilePermission "d:/testPolicy.txt", "read";
};
这个文件的作用
第一行:grant codeBase "file:D:/workspace/TestPolicy/bin/*"意思是给D:/workspace/TestPolicy/bin/*给这个路径下的所有文件定义权限,星号是统配符,所有的意思
第二行:permission java.io.FilePermission "d:/testPolicy.txt", "read";意思是d:/testPolicy.txt这个文件 只分配读的权限。
第三步,运行,在cmd窗口输入(运行不起来,说明jdk的环境变量没有配置好,去配一下)
java -classpath D:/workspace/TestPolicy/bin -Djava.security.manager -Djava.security.policy=D:/workspace/TestPolicy/src/myPolicy.txt com.yfq.test.TestPolicy
这句话的意思,把当前的类路径指定为D:/workspace/TestPolicy/bin,启动默认的安全管理器(这里你应该也猜到了,策略必须和安全管理器一起合作才能起作用)
第四步,查看输出
异常,提示本应用对d:/testPolicy.txt这个文件没有写的权限。
修改一下上面的myPolicy.txt文件,如下
grant codeBase "file:D:/workspace/TestPolicy/bin/*" {
permission java.io.FilePermission "d:/testPolicy.txt", "read,write";
};
再次运行,没有报错。
这基本就是安全管理器和策略文件搭配下实现对目标资源控制的一个简单流畅,安全管理器通过访问策略文件来确定对目标文件有多少权限,策略文件(本例中的myPolicy.txt)在jvm中对应着java.security.Policy类,
总结为:
java对应用程序的访问控制策略是由抽象类java.security.Policy的一个子类的单例所表示,
任何时候,每个应用程序实际上只有一个Policy对象,Policy对象对应着策略文件。
类装载器利用这个Policy对象来帮助他们决定,在把一段代码导入虚拟机时应该给予什么权限。