您的位置:首页 > 编程语言 > Java开发

JAVA策略文件简介(上)

2011-12-14 11:32 148 查看
原文地址:http://download.oracle.com/javase/1.5.0/docs/guide/security/PolicyFiles.html
编译转载自:http://hi.baidu.com/sqxxr/blog/item/51e00dcb084c91eb52664f83.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。
关于user.home的更多内容请参照《JAVA系统属性之user.home

  初始化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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息