JavaTM安全体系结构(JDK1.2)
6. 安全性管理
6.1 管理Applet和应用程序
-
-
目前,所有JDK系统代码都是调用SecurityManager方法以检查现行策略并进行访问控制检查。不管一个Applet是在何时运行,都典型地安装一个安全管理器(SecurityManager实现);appletviewer和大多数浏览器(包括Netscape和Microsoft的浏览器)都安装了安全管理器。
-
当运行一个应用程序时,安全管理器不能被自动安装。为了象运行下载的Applet一样将同样的安全策略应用于一个在本地文件系统中的应用程序,运行该应用程序的用户必须使用新的 "-Djava.security.manager"命令行自变量(它设置java.security.manager的值)来调用Java虚拟机,如下所示:
-
java -Djava.security.manager SomeApp
-
或者,该应用程序本身必须调用java.lang.System类中的setSecurityManager方法,以安装一个安全管理器。
-
可以用一个命令行来指定一个特殊的安全管理器。方法是在"-Djava.security.manager"后加上一个等号,再加上将作为安全管理器使用的类名。如下所示:
-
java -Djava.security.manager=COM.abc.MySecMgr SomeApp
-
如果没有安全管理器被指定,则将使用内置缺省安全管理器(除非应用程序安装了一个不同的安全管理器)。下列几行命令是等价的,它们都会安装缺省安全管理器:
-
java -Djava.security.manager SomeApp
-
java -Djava.security.manager= "" SomeApp
-
java -Djava.security.manager=default SomeApp
-
JDK1.2包括一个名为java.class.path的属性。那些被存储在本地文件系统但不被当作基础类的类应该在这个路径下。在这个路径下的类用安全类装载器来装载,并且符合当前推行的安全策略。
-
还有一个 "-Djava.security.policy"命令行自变量,它的用法决定了应采用什么样的策略文件。这个命令行自变量在"缺省系统和用户策略文件"一节中详述。一般来说,如果你在一个命令行中未包括 "-Djava.security.policy",则在安全属性文件中所指定的策略文件将被使用。
-
当调用一个应用文件的执行时,你可以使用一个"-Djava.security.policy" 命令行自变量来指定一个附加的或不同的策略文件。举例如下:如果你键入以下命令行(这里的pURL是一个指定策略文件位置的URL),除了所有在安全属性中指定的策略文件外,上述由URL所指定的策略文件也将被装载。
-
java -Djava.security.manager -Djava.security.policy= pURL SomeApp
-
如果你不这样做,而是使用如下命令,即使用双等号来代替上面的单等号,则只有指定的策略文件被使用,其它策略文件将被忽略:
-
java -Djava.security.manager -Djava.security.policy = = pURL SomeApp
6.2 SecurityManager和AccessController
-
新的访问控制机制是全部向后兼容的。例如,在SecurityManager中的所有check方法仍然被支持(尽管它们的大多数实现已被变为调用新的SecurityManager 中的checkPermission方法,它们的缺省实现调用AccessController 的checkPermission方法)。注意:某些内部安全检查可能驻留在SecurityManager类中,除非它能被参数化。
- 到目前为止,我们还没有修改任何JDK代码系统以调用AccessController来代替调用SecurityManager(和检查类装载器的存在),这是由于现有的第三方应用程序可能创建SecurityManager子类并使check方法用户化。事实上,我们增加了一个新的方法SecurityManager.checkPerm