我正在探索Java类加载器,然后遇到SecureClassLoader

在查看了其源代码并阅读了一些文章之后,我意识到我无法理解它的安全功能和使用范围。

谁能解释SecureClassLoader的用途?

为什么它是“安全的”?

谢谢。

最佳答案

Java安全模型基于具有特定权限的类。

当某些方法尝试执行特权操作时(例如,打开文件系统上的文件或打开网络套接字),将检查调用堆栈上的每个类以确定其是否具有适当的权限。

通过以下两种方式之一将权限授予类:


静态地,当类被定义时。
基于当前安全策略动态地(但仅当该类被定义为具有动态策略时)。


在这两种情况下,都通过传递给ClassLoader.defineClass的ProtectionDomain授予权限。 ProtectionDomain有两部分:静态授予该类的权限,以及“代码源”(从中加载类的位置,通常是JAR或目录)或“代码签名者”(保证类来自于具体来源)。如果类加载器创建了保护域,则将代码源(或签名者)与当前的安全策略动态匹配,以确定是否应授予其他权限(例如,“从此特定JAR加载的类可以从该特定目录读取文件”)允许动态的安全策略。

SecureClassLoader具有使用CodeSource的实用程序defineClass方法,并且它为每个CodeSource维护一个由懒惰创建的ProtectionDomain的缓存(如果要定义静态权限,则允许您的子类覆盖getPermissions),这样您的ClassLoader只需记住CodeSource而不是ProtectionDomain 。实际上,大多数ClassLoader实现都有预定义的类路径,因此它们可以轻松创建和存储ProtectionDomain本身,因此类本身并不是特别有用。

10-08 20:01