2

我正在尝试在不借助特殊库的情况下用 java 构建插件系统。

截至目前,我能够加载和处理我的插件。但是,我需要定义一个特殊的安全管理器来禁用对文件删除和其他的任何访问。

这个安全管理器应该只保留插件,因为我系统的核心必须执行一些插件不能执行的操作。结果,我无法使用 System 类设置安全管理器,否则它也会影响我系统的核心。

加载插件后,我尝试“重置”默认安全管理器,但我无法做到这一点。即使我能做到,插件最终也会执行系统当前的安全管理器,而不是它们自己的。

我想知道是否有办法将类封装到特定的安全管理器。

在我的头上,我正在考虑查看堆栈跟踪,如果发现一个插件类作为调用者,禁止他们不应该执行的操作,但我担心这会证明在性能方面有点无效。

我会尽快将代码发布到我的安全经理,以帮助提出想法。

这是我的安全管理器的代码:

package org.zeh.filemanager.core.controllers.util;
import java.io.FileDescriptor;

/**
 * @author José Ricardo Carvalho Prado de Almeida
*/
public class PluginSecurityManager extends SecurityManager {
    @Override
    public void checkRead(FileDescriptor filedescriptor) {
        super.checkRead(filedescriptor);
    }

    @Override
    public void checkRead(String filename) {
        super.checkRead(filename);
    }

    @Override
    public void checkRead(String filename,
                          Object executionContext) {
        //
        super.checkRead(filename,
                        executionContext);
    }

    @Override
    public void checkWrite(FileDescriptor filedescriptor) {
        throw new SecurityException("Plugin is trying to write files.");
    }

    @Override
    public void checkWrite(String filename) {
        throw new SecurityException("Plugin is trying to write files.");
    }

    @Override
    public void checkDelete(String file) {
        super.checkDelete(file);
        throw new SecurityException("Plugin is trying to delete files.");
    }

    @Override
    public void checkExec(String cmd) {
        super.checkExec(cmd);
        throw new SecurityException("Plugin is trying to create subprocesses.");
    }

    @Override
    public void checkExit(int status) {
        super.checkExit(status);
        throw new SecurityException("Plugin is trying to finalize the JVM.");
    }

    @Override
    public void checkCreateClassLoader() {
        super.checkCreateClassLoader();
        throw new SecurityException("Plugin is trying to create ClassLoaders.");
    }
}

我发现了一个问题(如何安全地实现 Java 插件安全?),这与我的非常相似,但答案并不真正适合我的上下文,因为我不需要外部库。

我忘了提到我确实有一个自定义的类加载器,到目前为止它工作得很好。

我设计了这个程序,所以每种插件都有一个特殊的类加载器,这样的加载器会有它自己的安全管理器,以根据功能限制不同的插件。

这种设计不起作用的唯一原因是因为那些安全管理器。如果我忽略了安全管理器的使用,系统会做它应该做的一切,尽管它并不安全。

有没有人有这个问题的可能解决方案?谢谢你。

4

0 回答 0