以编程方式授予权限而不使用策略文件

Ade*_*ros 10 java permissions rmi policyfiles

如何以编程方式授予AllPermissionsRMI应用程序,而无需使用策略文件?

更新:

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

现在我收到以下错误:

无效权限:(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();
    }

}
Run Code Online (Sandbox Code Playgroud)

Ade*_*ros 13

根据@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);
    }

}
Run Code Online (Sandbox Code Playgroud)
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;
    }

}
Run Code Online (Sandbox Code Playgroud)