我正在尝试写一个插件基础的SecurityManager,我想知道如何/如果我可以使权限只适用于插件目录中的插件。目前,权限适用于所有内容。
import java.security.AccessControlContext;
import java.security.AccessController;
import java.security.Permission;
public class PluginSecurityManager extends SecurityManager {
public PluginSecurityManager() {
this.context = AccessController.getContext();
System.setProperty("java.security.policy", "res/security/policy.txt");
}
public void checkPermission(Permission perm) {
this.checkPermission(perm, context);
}
public AccessControlContext getContext() {
return context;
}
private final AccessControlContext context;
}策略文件
grant codeBase "file:/plugins/*" {
permission java.io.FilePermission "res/*", "read";
permission java.io.FilePermission "user.dir/ikaros-cache/cache.zip", "read";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};发布于 2015-07-02 01:01:13
通过将检查传递给AccessController,SecurityManager已经使用了策略文件。
几乎没有理由将SecurityManager子类化。您需要权限才能执行此操作,因此您对AccessController.getContext的调用可能会返回有效的完全权限。
如果插件需要完全权限,则通过反射来禁止访问检查。
编辑:哦,我还看到你在构造了一个SecurityManager初始化相关的全局状态之后,似乎正在改变一个系统属性。一般来说,这类东西不会被重读。
https://stackoverflow.com/questions/31166203
复制相似问题