Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用已不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的概述,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能以及已删除或不建议使用的选项的信息,请参阅JDK发布说明。
下面是一个完整的策略文件,供用户运行ExampleGame。
策略文件的语法不在此处描述;如果您感兴趣,请参阅默认策略实现和策略文件语法页面。
您不需要了解语法;您可以始终使用策略工具来创建策略文件,如在创建策略文件、控制应用程序的快速入门和签署代码和授予权限教程中所示。
下面是示例策略文件,后面是各个条目的说明。假设
kim.keystore。ExampleGame已由游戏创建者Terry的私钥签署,并且相应的公钥位于由"terry"别名命名的密钥库条目中。HighScore和HighScorePermissions类由实现它们的人(Chris)的私钥签署,并且相应的公钥位于由"chris"别名命名的密钥库条目中。以下是策略文件: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";
策略文件条目指定了针对特定的代码源的一个或多个权限 - 要么是来自特定位置(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类的权限。更具体地说,它授予由"chris"签名的代码权限,他创建并签名了这个类。要求该类由"chris"签名确保当ExampleGame调用该类来更新用户的高分时,ExampleGame确切地知道它正在使用"chris"实现的原始类。
为了更新调用它的任何游戏的用户的高分值,HighScore类需要三个权限:
"user.home"属性值的权限。HighScore类将用户的高分值存储在用户的主目录中的一个.highscore文件中。因此,此类需要一个java.util.PropertyPermission,允许它读取"user.home"属性值以确定用户的主目录的准确位置:
permission java.util.PropertyPermission
"user.home", "read";
需要此权限以便HighScore的getHighScore和setHighScore方法可以访问用户的.highscore文件,以获取或设置当前游戏的最高分。
以下是所需的权限:
permission java.io.FilePermission
"${user.home}${/}.highscore", "read,write";
注意:符号${propName}指定了一个属性的值。因此,${user.home}将被替换为"user.home"属性的值。符号${/}是一种独立于平台的指定文件分隔符的方法。
需要此权限以便HighScore检查调用游戏是否被授予其名称为游戏名称的HighScorePermission。也就是说,HighScore类还必须被授予该权限,因为权限检查要求堆栈上的所有代码都具有指定的权限。
以下是所需的权限:
permission com.scoredev.scores.HighScorePermission
"*", signedBy "chris";
与之前一样,HighScorePermission本身需要由实际实现该权限的人"chris"签名。