SecurityManager安全管理器

权限设定文件F:/my.policy类容如下:
grant{
permission java.io.FilePermission "F:/*", "read";
};

作用:在应用程序中访问F:盘符下的所有文件时只能读取不能写入。
在这里其实有很多的权限设定如:
[color=blue][list]
[*]AllPermission
[*]BasicPermission
[*]FilePermission
[*]SocketPermission
[/list][/color]在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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值