启动SecurityManager开关:
隐式:
启动时添加JVM启动参数:
-Djava.security.manager :启动默认的安全管理器;
-Djava.security.policy="E:/java.policy":指定安全管理器的配置文件;
显式:
实例化一个java.lang.SecurityManager或继承它的子类的对象,然后通过System.setSecurityManager()来设置并启动一个安全管理器。
System.setSecurityManager(new SecurityManager());
配置Policy文件:
JVM自带的Policy文件位于%JAVA_HOME%/jre/lib/security/java.policy;
Java.policy解析:
grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};
定义了系统属性${{java.ext.dirs}}路径(%JAVA_HOME%/jre/lib/ext)下的所有的class及jar拥有所有的操作权限;关于配置的路径说明:
directory/ :表示directory目录下的所有.class文件,不包括.jar文件;
directory/* :表示directory目录下的所有.class文件,不包括.jar文件;
directory/- :表示directory目录下的所有.class文件,不包括.jar文件;
grant {
permission java.io.FilePermission "d:/1.txt", "read";
};
表示给d:\1.txt文件赋予读的权限;
Demo:
public class SecurityManagerTest {
public static void main(String[] args)throws FileNotFoundException {
System.out.println("SecurityManager: " + System.getSecurityManager());
FileInputStreamfis = new FileInputStream("c:\\protect.txt");
System.out.println(System.getProperty("file.encoding"));
}
}
1、不添加任何参数运行,相当于没有启动安全管理器,程序运行正常;
2、添加启动参数:-Djava.security.manager-Djava.security.policy=c:/protect.policy
运行会报AccessControlException异常;
3、需要在protect.txt中添加授权语句:
grant {
permissionjava.io.FilePermission "c:/protect.txt", "read";
permissionjava.util.PropertyPermission "file.encoding", "read";
};
此时再运行则正常;
工作原理:
当应用程序要读取本地文件时,securitymanager就会在读取前进行拦截,判断是否有读取此文件的权限,如果有则顺利读取,否则将抛出访问异常。SecurityManager类中提供了很多检查权限的方法,例如checkPermission方法会根据安全策略文件描述的权限对操作进行判断是否有操作权限,而checkRead方法则用于判断对文件访问权限。一旦发现没有权限都会抛出安全异常。