我正在探索 Java 类加载器,然后我遇到了SecureClassLoader.
在查看其源代码并阅读一些文章后,我意识到我无法理解它的安全功能和使用范围。
谁能解释一下它的SecureClassLoader用途是什么?
为什么它“安全”?
谢谢。
Java 安全模型基于具有特定权限的类。
当某些方法尝试执行特权操作(例如,打开文件系统上的文件或打开网络套接字)时,将检查调用堆栈上的每个类以确定它是否具有适当的权限。
通过以下两种方式之一向类授予权限:
在这两种情况下,权限都是通过传递给 ClassLoader.defineClass 的 ProtectionDomain 授予的。ProtectionDomain 有两部分:静态授予类的权限,以及“代码源”(加载类的位置,通常是 JAR 或目录)或“代码签名者”(保证来自某个类的类)。具体来源)。代码源(或签名者)会根据当前安全策略进行动态匹配,以确定如果类加载器创建了保护域,是否应授予其他权限(例如,“从此特定 JAR 加载的类可以从此特定目录读取文件”)允许动态安全策略。
SecureClassLoader有一个实用程序defineClass方法,它接受CodeSource,并且它为每个CodeSource维护延迟创建的ProtectionDomain的缓存(如果您想定义静态权限,则允许您的子类覆盖getPermissions),以便您的ClassLoader只需要记住CodeSource而不是ProtectionDomain 。实际上,大多数 ClassLoader 实现都有一个预定义的类路径,因此它们可以轻松地创建和存储自己的 ProtectionDomain,因此类本身并不是特别有用。