`

SecurityManager安全管理器

 
阅读更多
权限设定文件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
    }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics