转自:http://docs.oracle.com/javase/1.5.0/docs/guide/security/PolicyFiles.html
一、前言
JVM可以通过java.security.Policy的实例化对象根据代码的来源和其签名者来为其指定不同的权限。
在任何时候只能有一个起作用。当前安装的Policy对象,在程序中可以通过调用
Policy.getPolicy()
方法得到,也可以通过调用
Policy.setPolicy()
方法改变。Policy对象评估整个策略,返回一个适当的Permissions对象,详细说明那些代码可以访问那些资源。
系统默认使用的Policy对象是java.security.Policy的子类
sun.security.provider.PolicyFile
的实例化对象。为了方便,JVM提供了把由Policy文件来定制Policy对象的功能。
sun.security.provider.PolicyFile
是根据配置文件中指定的策略来实现进行代码权限的管理。对于这种配置文件,我们称之为JAVA策略文件。
二、缺省Policy实现
sun.security.provider.PolicyFile
是系统默认的Policy实现,我们暂且称之为
缺省Policy 实现
。在缺省 Policy 实现中,可在一个或多个策略配置文件中指定策略。配置文件的作用是指定一些代码所能获得的权限。可利用简单的文本编辑器或 Policy Tool 实用程序来编写策略文件。 默认情况下,系统上只有单个全系统策略文件和唯一的(可选)用户策略文件。 首次调用
sun.security.provider.PolicyFile
对象的 getPermissions方法或在任何时候调用其refresh方法时,即分析策略文件,并据此对该对象进行初始化。
三、策略文件的位置
3.1、默认的策略文件
如前所述,系统在缺省Policy实现下具有单个全系统策略文件和唯一的用户策略文件。
系统策略文件的默认位置为:
java.home/lib/security/java.policy (Solaris)
java.home\lib\security\java.policy (Windows)
java.home
是指
JAVA系统中名为
“
java.home
“的
属性的值,它表示的是JRE的安装目录。比如,
C:\Program Files\Java\jre6
在JAVA程序中,可以通过System.getProperty("
java.home
")这种方式得到其值.
系统策略文件可用于授予全系统代码权限。与 JDK 一起安装的 java.policy 文件可向标准扩展 (Java standard extensions) 授予全部权限,允许任何用户在无特权要求的端口进行监听,同时允许任何代码读取某些对安全不敏感的“标准”属性(例如“os.name”和“file.separator”属性)。
用户策略文件的默认位置为:
user.home/.java.policy (Solaris)
user.home\.java.policy (Windows)
user.home
指的是JAVA系统中名为“
user.home”
的属性的值,它表示的是用户的主目录。
在 Windows 系统中,对于用户
Administrator
就是
C:\Documents and Settings\
Administrator。
初始化Policy 时,将首先加载系统策略,然后在 Policy 中添加用户策略。如果两种策略均不存在,则采用内置策略。该内置策略与原始的沙箱策略相同。
策略文件的默认位置其实是在系统的
安全属性文件
中指定。安全属性文件的位置为:
java.home/lib/security/java.security (Solaris)
java.home\lib\security\java.security (Windows)
如上所述,java.home 指示JDK 的安装目录。策略文件的位置被指定为其名称具有以下形式的属性的值:
policy.url.n
其中 n 为数字。应采用以下形式的语句行来指定每个属性值:
policy.url.n=URL
其中,URL 为 URL 规范,
应该始终用正斜杠(而不要用反斜杠)作为目录分隔符,即使代码源实际在 Windows 系统上
例如,
安全属性文件
中将把缺省Policy实现的系统策略文件和用户策略文件定义为:
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy
有关利用特殊语法(例如利用 ${java.home} 来指定 java.home 属性值来指定属性值的详细信息,请参阅属性扩展。
3.2、静态指定策略文件
实际上,在系统的
安全属性文件
中,用户可以指定多个 URL(包括“http://”形式的 URL),从而加载更多的策略文件。也可注释掉或更改第二个 URL,从而禁止读取缺省用户策略文件。
该算法自
policy.url.1
开始,然后不断递增直到查不到 URL 为止。因此,如果有了 policy.url.1 和 policy.url.3,而没有
policy.url.2的话,
就不会读取 policy.url.3。
3.3、运行时动态指定策略文件
在执行应用程序时也可以指定附加的或不同的策略文件,方法是用“-Djava.security.policy”命令行参数来指定(该命令行参数设置 java.security.policy 属性值)。例如,如果使用
java -Djava.security.manager -Djava.security.policy=someURL SomeApp
这里 someURL 是指定策略文件位置的 URL,则除了加载安全属性文件中指定的所有策略文件外,还会加载本方法所指定的策略文件。
注意:1、URL可以是任何标准 URL,也可以只是当前目录下策略文件的文件名,如下例所示:
java -Djava.security.manager
-Djava.security.policy
=mypolicy WriteFile
2、“
-Djava.security.manager”参数可确保缺省安全管理器已被安装,这样就容易对应用程序进行策略检查。如果应用程序SomeApp 安装有安全管理器,则不需要该参数。
如果使用
java -Djava.security.manager -
Djava.security.policy
==
someURL SomeApp
(请注意双等号),就会仅使用指定的策略文件,而安全属性文件中指出的策略文件将被忽略。
如果要将策略文件传递给
appletviewer
命令,就应使用参数“
-J-Djava.security.policy
”,如下所示:
appletviewer -J
-Djava.security.policy
=someURL myApplet
注意:如果将
安全属性文件中的“
policy.allowSystemProperty”属性设置为“
false”,就会忽略“
-Djava.security.policy”策略文件值(对于java 和 appletviewer 命令)。缺省值为“true”。
这种方法使用灵活,特别是作为一个软件包在企业内部网中发布时,安装、设置和迁移软件,基本无须修改Policy文件的内容,使用起来相当简单,而且,安全许可的范围控制较精细
四、更改 Policy 实现
可以用其它policy 类来代替系统的缺省Policy实现类,前提是它必须是抽象类Policy类的子类并实现了getPermissions 方法(及其它必要的方法)。
可通过编辑
安全属性文件
来完成缺省Policy 实现的更改。安全属性文件是指JRE的lib/security目录中的
java.security
文件。
下面是在java.security 中设置的Policy实现类的形式:
policy.provider=PolicyClassName
PolicyClassName
必须用其Policy实现类的完整名称。默认的是设置为系统的Policy的缺省实现类,即
sun.security.provider.PolicyFile
,如下:
policy.provider=sun.security.provider.PolicyFile
要想自定义安全属性文件项,可通过更改属性值来指定另一个类,如下例所示:
policy.provider=com.mycom.MyPolicy