文档

Java™教程
隐藏目录
示例策略文件
路径: Java SE 中的安全特性
课程: 实现自己的权限

一个样本策略文件

下面是一个完整的策略文件,供用户运行ExampleGame

策略文件的语法不在此处描述;如果您感兴趣,请参阅默认策略实现和策略文件语法页面。

您不需要了解语法;您可以始终使用策略工具来创建策略文件,如在创建策略文件控制应用程序的快速入门签署代码和授予权限教程中所示。

下面是示例策略文件,后面是各个条目的说明。假设

以下是策略文件:kim.policy

keystore "kim.keystore";

// 这是ExampleGame需要的权限。
// 它会授予由"terry"签署的
// HighScorePermission,如果
// HighScorePermission由"chris"签署
grant SignedBy "terry" {
  permission
    com.scoredev.scores.HighScorePermission
      "ExampleGame", signedBy "chris";
};

// 这是HighScore类需要的权限集合:
grant SignedBy "chris" {
  // HighScore类需要读取"user.home"来查找
  // highscore文件的位置的权限

  permission java.util.PropertyPermission
    "user.home", "read";

  // 它需要读写高分文件本身的权限

  permission java.io.FilePermission
      "${user.home}${/}.highscore", "read,write";

  // 它需要被授予自己的权限,
  // 以便它可以调用checkPermission
  // 来查看其调用者是否有权限。
  // 只有在权限本身由"chris"签署时才授予它权限。

  permission
    com.scoredev.scores.HighScorePermission 
      "*", signedBy "chris";
};


密钥库条目

密钥库是密钥和证书的存储库,用于查找策略文件中指定的签名者的公钥(在此示例中为"terry""chris")。

keytool实用程序用于创建和管理密钥库。

在本课程中,假设Kim想玩ExampleGame。如果Kim的密钥库的名称为kim.keystore,那么Kim的策略文件在开头需要以下行:

keystore "kim.keystore";

ExampleGame条目

策略文件条目指定了针对特定的代码源的一个或多个权限 - 要么是来自特定位置(URL)的代码,要么是由特定实体签名的代码,或者两者兼而有之。

我们的策略文件需要为每个游戏创建一个条目,授予由该游戏创建者的密钥签名的代码一个名为HighScorePermission的权限,该权限允许游戏调用HighScore方法来获取或更新该特定游戏的用户高分值。

ExampleGame所需的条目是:

grant SignedBy "terry" {
    permission
        com.scoredev.scores.HighScorePermission 
            "ExampleGame", signedBy "chris";
};

要求ExampleGame"terry"签名使Kim能够知道游戏确实是由Terry开发的。为了使此功能正常工作,Kim必须已经使用别名"terry"将Terry的公钥证书存储到kim.keystore中。

请注意,HighScorePermission需要由实际实现该权限的"chris"签名。这确保ExampleGame被授予由"chris"实现的实际权限,而不是其他人。与之前一样,为了使此功能正常工作,Kim必须已经使用别名"chris"将Chris的公钥证书存储到kim.keystore中。

HighScore条目

策略文件中的最后一个条目授予HighScore类的权限。更具体地说,它授予由"chris"签名的代码权限,他创建并签名了这个类。要求该类由"chris"签名确保当ExampleGame调用该类来更新用户的高分时,ExampleGame确切地知道它正在使用"chris"实现的原始类。

为了更新调用它的任何游戏的用户的高分值,HighScore类需要三个权限:

1. 读取"user.home"属性值的权限。

HighScore类将用户的高分值存储在用户的主目录中的一个.highscore文件中。因此,此类需要一个java.util.PropertyPermission,允许它读取"user.home"属性值以确定用户的主目录的准确位置:

permission java.util.PropertyPermission 
    "user.home", "read";

2. 读取和写入高分文件的权限。

需要此权限以便HighScoregetHighScoresetHighScore方法可以访问用户的.highscore文件,以获取或设置当前游戏的最高分。

以下是所需的权限:

permission java.io.FilePermission
    "${user.home}${/}.highscore", "read,write";

注意:符号${propName}指定了一个属性的值。因此,${user.home}将被替换为"user.home"属性的值。符号${/}是一种独立于平台的指定文件分隔符的方法。

3. 所有HighScorePermissions(即任何名称的HighScorePermissions)。

需要此权限以便HighScore检查调用游戏是否被授予其名称为游戏名称的HighScorePermission。也就是说,HighScore类还必须被授予该权限,因为权限检查要求堆栈上的所有代码都具有指定的权限。

以下是所需的权限:

permission com.scoredev.scores.HighScorePermission
    "*", signedBy "chris";

与之前一样,HighScorePermission本身需要由实际实现该权限的人"chris"签名。


上一页: HighScorePermission类
下一页: 将所有内容整合起来