我有一个用于受信任应用程序代码的ClassLoader,还有一个用于用户提交的(不受信任)代码的ClassLoader。
我想让用户提交的代码受到Security Manager的限制。我如何在SecurityManager内部检查调用者的来源?请参见伪代码:
System.setSecurityManager(new SecurityManager() {
public void checkPermission(Permission permission) {
if (/*caller class is not loaded by the trusted classloader*/) {
throw new SecurityException("You do not have permissions.");
}
}
});
我已经尝试过的方法:
StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass().getClassLoader()
首先检查权限,因此会导致堆栈溢出异常。Thread.currentThread().getStackTrace()[2].getClassLoaderName()
不安全,因为它只提供了类加载器名称,而没有提供类对象。如果不受信任的加载器的规范名称与受信任的加载器相同,则存在安全问题。
getInstance()
期间,因此您只需要授予一次即可。 - the8472ProtectionDomain
/CodeSource
中,并且具有自己的权限(与你自己的代码分开)。这样,你就可以让SecurityManager
自动处理它。 - Slaw