权限设定文件F:/my.policy类容如下:
grant{
permission java.io.FilePermission "F:/*", "read";
};
作用:在应用程序中访问F:盘符下的所有文件时只能读取不能写入。
在这里其实有很多的权限设定如:
- AllPermission
- BasicPermission
- FilePermission
- SocketPermission
在BasicPermission下还有很多的细分的子权限。详细设置请查看java核心技术卷二 第8版 第669页
System.setProperty("java.security.policy", "F:/my.policy");//设置权限定义文件位置
System.setSecurityManager(new SecurityManager());//安装权限管理,从此处开始生效
FileOutputStream out = new FileOutputStream("f:/temp.sql",true);
out.write("test".getBytes());
out.flush();
执行上述代码会出现如下异常:
Exception in thread "main" java.security.AccessControlException: access denied (java.io.FilePermission f:\temp.sql write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkWrite(SecurityManager.java:962)
at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
at java.io.FileOutputStream.<init>(FileOutputStream.java:102)
at org.plugbase.util.Test.main(Test.java:28)
底层实现原理解析:
下面是FileOutputStream构造函数的方法:
public FileOutputStream(File file, boolean append)
throws FileNotFoundException
{
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {//判断是否安装了安全管理器默认下是不安装的
security.checkWrite(name);//如果安装了进行检查如果检查未通过将会抛出异常
}
if (name == null) {
throw new NullPointerException();
}
fd = new FileDescriptor();
this.append = append;
if (append) {
openAppend(name);
} else {
open(name);
}
}
checkWriter方法中的代码
public void checkWrite(String file) {
checkPermission(new FilePermission(file,
SecurityConstants.FILE_WRITE_ACTION));//这是在检查FilePermission中的安全设置,在my.policy中已经设置为read
}