java - 在不使用策略文件的情况下以编程方式授予权限

标签 java permissions rmi policyfiles

如何在不使用策略文件的情况下以编程方式向 RMI 应用程序授予 AllPermissions

更新:

经过一些研究,我编写了这个自定义策略类并通过 Policy.setPolicy(new MyPolicy()) 安装了它。

现在我得到以下错误:

invalid permission: (java.io.FilePermission \C:\eclipse\plugins\org.eclipse.osgi_3.7.0.v20110613.jar read

class MyPolicy extends Policy {

    @Override
    public PermissionCollection getPermissions(CodeSource codesource) {
        return (new AllPermission()).newPermissionCollection();
    }

}

最佳答案

根据 @EJP 的建议,我使用 -Djava.security.debug=access 进行了调试,并在策略文件中找到了所有需要的权限:

grant { permission java.net.SocketPermission "*:1024-", "connect, resolve"; };

grant { permission java.util.PropertyPermission "*", "read, write"; };

grant { permission java.io.FilePermission "<>", "read"; };

但是因为我不想创建策略文件,所以我找到了一种通过扩展 java.security.Policy 类并在我的应用程序启动时使用Policy.setPolicy(new MinimalPolicy());

public class MinimalPolicy extends Policy {

    private static PermissionCollection perms;

    public MinimalPolicy() {
        super();
        if (perms == null) {
            perms = new MyPermissionCollection();
            addPermissions();
        }
    }

    @Override
    public PermissionCollection getPermissions(CodeSource codesource) {
        return perms;
    }

    private void addPermissions() {
        SocketPermission socketPermission = new SocketPermission("*:1024-", "connect, resolve");
        PropertyPermission propertyPermission = new PropertyPermission("*", "read, write");
        FilePermission filePermission = new FilePermission("<<ALL FILES>>", "read");

        perms.add(socketPermission);
        perms.add(propertyPermission);
        perms.add(filePermission);
    }

}

class MyPermissionCollection extends PermissionCollection {

    private static final long serialVersionUID = 614300921365729272L;

    ArrayList<Permission> perms = new ArrayList<Permission>();

    public void add(Permission p) {
        perms.add(p);
    }

    public boolean implies(Permission p) {
        for (Iterator<Permission> i = perms.iterator(); i.hasNext();) {
            if (((Permission) i.next()).implies(p)) {
                return true;
            }
        }
        return false;
    }

    public Enumeration<Permission> elements() {
        return Collections.enumeration(perms);
    }

    public boolean isReadOnly() {
        return false;
    }

}

关于java - 在不使用策略文件的情况下以编程方式授予权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11737971/

相关文章:

Java RMI心跳时间进程循环

java - Class.forName ("FQN") 间歇性抛出 ClassNotFoundException

java - java.rmi.Naming 和 java.rmi.registry.LocateRegistry 有什么区别

java - 无法解析 com.android.tools.build :gradle:7. 0.0

javascript - 如何使用 Selenium 和 Java 处理 JavaScript 弹出窗口?

java - 转换为 Graphics2D

用于将 Windows 屏幕镜像到 Anycast 设备的 Java 应用程序

每个成员组的 PHP 和 MySQL 限制区域

sharepoint - 在 Windows Sharepoint Services 3.0 中仅编辑拥有的列表项

mysql - 在Rails中动态可定制的基于组的授权