java的安全策略

来源:互联网 发布:gta5优化补丁3dm 编辑:程序博客网 时间:2024/06/06 09:02

java的安全策略

if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {                    isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {                        @Override                        public Boolean run() {                            return ((SmartFactoryBean<?>) factory).isEagerInit();                        }                    }, getAccessControlContext());                }

这个是spring 源码中初始化singleton bean的逻辑。
AccessController.doPrivileged 第一次遇见,网上搜索了一些资料。

安全策略背景

    众所周知,Java语言具有完善的安全框架,从编程语言,编译器、解释程序到Java虚拟机,都能确保Java系统不被无效的代码或敌对的编译器暗中破坏,基本上,它们保证了Java代码按预定的规则运作。但是,当我们需要逾越这些限制时,例如,读写文件,监听和读写Socket,退出Java系统等,就必须使用数字签名或安全策略文件(*.Policy)。

    在企业内部网中,本文提出了使用安全策略文件来设置java程序权限的一种简单的方法。由于企业内部网中各台计算机的位置、用途和安全性明确,更适于使用安全策略文件来设置java的权限,软件的安装、设置、升级和迁移都非常的方便,并且,还可以和数字签名配合使用,更重要的是,可以细分每个java程序的权限,使用起来灵活方便。

什么是安全策略?

    Java应用程序环境的安全策略,详细说明了对于不同的代码所拥有的不同资源的许可,它由一个Policy对象来表达。为了让applet(或者运行在SecurityManager下的一个应用程序)能够执行受保护的行为,例如读写文件,applet(或Java应用程序)必须获得那项操作的许可,安全策略文件就是用来实现这些许可。

策略安全文件(*.policy)格式

grant codeBase "file:/C:/zhouhbFile/developments/eclipse-workspaces/ws-xgsdk-jee/AccessControllerTest/bin/*" {    permission java.io.FilePermission "f:/temp/AccessControllerTest2.jar", "read";    permission java.lang.RuntimePermission "createClassLoader";};grant codeBase "file:/f:/temp/AccessControllerTest2.jar" {    permission java.io.FilePermission "f:/temp/text.txt", "read";};

grant 表示赋予权限的意思
codeBase 表示后面的代码。即赋予权限给后面的代码。如果不限定则表示作用所有的代码。
具体可详情http://www.blogjava.net/china-qd/archive/2006/04/25/42931.html

一个示例说明安全策略

http://blog.csdn.net/zhang__jiayu/article/details/25654867
以上博文的示例,亲自试验是正确的。
如果在policy文件中的grant codeBase "file:/C:/zhouhbFile/developments/eclipse-workspaces/ws-xgsdk-jee/AccessControllerTest/bin/*"片段中加入如下代码
permission java.io.FilePermission "f:/temp/text.txt", "read";
不使用AccessController.doPrivileged程序也是可以运行的。这表明在调用stack里面,file:/C:/zhouhbFile/developments/eclipse-workspaces/ws-xgsdk-jee/AccessControllerTest/bin/* 是需要读text.txt文件的权限的。博主总结的很好,感谢。

AccessController.doPrivileged(new PrivilegedAction() {        public Object run() {            doFileOperation();            return null;        }    });
0 0