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

时间:2012-07-31 10:20:57

标签: java permissions rmi policyfiles

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

更新

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

现在我收到以下错误:

  

无效权限:(java.io.FilePermission   \ C:\ eclipse \ plugins \ org.eclipse.osgi_3.7.0.v20110613.jar阅读

class MyPolicy extends Policy {

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

}

4 个答案:

答案 0 :(得分:13)

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

  

grant {permission java.net.SocketPermission“*:1024-”,“connect,   解决“;};

     

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;
    }

}

答案 1 :(得分:2)

因为你的

  

new AllPermission())。newPermissionCollection()

被Java视为不可变(为什么要为已经允许所有权限的集合添加权限?),并且因为Java会尝试向集合添加权限。这就是错误消息的来源--Java尝试将java.io.FilePermission添加到AllPermission。

相反,这样做:

class MyPolicy extends Policy {
    @Override
    public PermissionCollection getPermissions(CodeSource codesource) {
        Permissions p = new Permissions();
        p.add(new PropertyPermission("java.class.path", "read"));
        p.add(new FilePermission("/home/.../classes/*", "read"));
        ... etc ...
        return p;
    }
}

答案 2 :(得分:1)

不要安装SecurityManager。只有在使用代码库功能时才需要它,如果需要,则需要正确的.policy文件,

答案 3 :(得分:0)

简短解决方案

将更新的解决方案扩展到:

SELECT DISTINCT

请注意,http://en.cppreference.com/w/cpp/language/operator_incdec必须始终返回可变 PermissionCollection

  

返回: ...如果支持此操作,则返回的权限集必须是新的可变实例,并且必须支持异构权限类型...

此解决方案已经有效,因为它会在UNION的每个调用中添加一个AllPermission对象,引用public class MyPolicy extends Policy { @Override public PermissionCollection getPermissions(CodeSource codesource) { Permissions p = new Permissions(); p.add(new AllPermission()); return p; } }

清洁解决方案

但是有一个更清晰的解决方案,它不会跟踪任何不必要的其他权限,因为AllPermissions已经允许了所有内容。

Policy.getPermissions(ProtectionDomain)