-->

以编程方式将权限授予不使用策略文件(Programmatically grant Permissio

2019-07-30 17:25发布

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

更新:

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

现在,我得到以下错误:

无效权限:(java.io.FilePermission中的\ C:\日食\插件\ org.eclipse.osgi_3.7.0.v20110613.jar阅读

class MyPolicy extends Policy {

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

}

Answer 1:

基于@EJP的建议,我一直在使用调试-Djava.security.debug=access ,发现所有的政策文件所需的权限:

授予{权限java.net.SocketPermission “*:1024-”, “连接起来,解决”; };

授予{权限java.util.PropertyPermission “*”, “读,写”; };

授予{权限java.io.FilePermission中 “<>”, “读取”; };

但是,因为我不想创建一个策略文件,我发现了一种通过扩展编程方式复制此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;
    }

}


Answer 2:

因为你的

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


Answer 3:

不安装安全管理器。 你只需要它,如果你使用的代码库的功能,如果你需要,你需要一个适当的.policy文件,



Answer 4:

简短的解决方案

扩展您的更新的解决方案:

public class MyPolicy extends Policy
{
    @Override
    public PermissionCollection getPermissions(CodeSource codesource)
    {
        Permissions p = new Permissions();
        p.add(new AllPermission());
        return p;
    }
}

想想,那Policy.getPermissions()必须返回一个可变的PermissionCollection

返回:...如果支持此操作时,返回的权限集必须是可变的新实例,并且它必须支持不同的Permission类型...

该解决方案已经工作,因为它增加了一个对象的AllPermission到的每一个电话Policy.getPermissions(ProtectionDomain) ,指代Policy.getPermissions(CodeSource)

清洁解决方案

但是有一个清晰的解决方案,不跟踪任何不必要的其他权限,因为所有权限允许漂亮一切了。

public class MyPolicy extends Policy
{
    private static class AllPermissionsSingleton extends PermissionCollection
    {
        private static final long serialVersionUID = 1L;
        private static final Vector<Permission> ALL_PERMISSIONS_VECTOR = new Vector<Permission>(Arrays.asList(new AllPermission()));

        @Override
        public void add(Permission permission)
        {
        }

        @Override
        public boolean implies(Permission permission)
        {
            return true;
        }

        @Override
        public Enumeration<Permission> elements()
        {
            return ALL_PERMISSIONS_VECTOR.elements();
        }

        @Override
        public boolean isReadOnly()
        {
            return false;
        }
    }

    private static final AllPermissionsSingleton ALL_PERMISSIONS_SINGLETON = new AllPermissionsSingleton();

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


文章来源: Programmatically grant Permissions without using policy file