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"
签名。