如果我正确理解AccessController.doPrivileged,则表示不受信任的代码应该能够通过具有权限的中间方法来调用需要权限的方法(例如System.getProperty()
)。
这就提出了一个问题:何时应使用AccessController.doPrivileged()
?什么时候应允许不可信代码通过中间方法调用特权代码?什么时候应该失败?
按照您的推理,请解释为什么应始终允许创建ClassLoader:http://findbugs.sourceforge.net/bugDescriptions.html#DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED
最佳答案
同意Suraj's answer,但以为我会在需要使用特权块的地方添加一个特定示例。
想象一下,您已经构建了一个为可插拔模块提供大量服务的应用程序。因此,您的应用及其服务是受信任的代码。但是,可插拔模块不一定是受信任的,而是在其自己的类加载器中加载(并具有自己的保护域)。
当可插拔模块调用服务时,您将实现自定义安全检查(“可插拔模块X是否有权使用此服务”)。但是服务本身可能需要一些核心Java权限(读取系统属性,写入文件等)。需要这些权限的代码包装在doPrivileged()
中,以便有效地忽略来自不受信任的可插拔模块的不足权限-仅应用受信任服务模块的特权。
关于java - 什么时候应该使用AccessController.doPrivileged()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2233761/