Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以编程方式授予权限而不使用策略文件_Java_Permissions_Rmi_Policyfiles - Fatal编程技术网

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

Java 以编程方式授予权限而不使用策略文件,java,permissions,rmi,policyfiles,Java,Permissions,Rmi,Policyfiles,如何在不使用策略文件的情况下,以编程方式将AllPermissions授予RMI应用程序 更新: 经过一些研究,我编写了这个自定义策略类,并通过Policy.setPolicy(newmypolicy())安装了它 现在我得到以下错误: 无效权限:(java.io.FilePermission) \C:\eclipse\plugins\org.eclipse.osgi_3.7.0.v20110613.jar读取 不要安装SecurityManager。只有在使用代码库功能,并且需要正确的.pol

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

更新:

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

现在我得到以下错误:

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


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

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

授予{permission java.net.SocketPermission“*:1024-”,“connect, 下定决心,

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

授予{permission java.io.FilePermission”““读取”; })

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

公共类最小策略扩展策略{
私人静态许可证;
公共政策(){
超级();
if(perms==null){
perms=新的MyPermissionCollection();
添加权限();
}
}
@凌驾
公共权限集合getPermissions(CodeSource CodeSource){
回烫;
}
私有void addPermissions(){
SocketPermission SocketPermission=新的SocketPermission(“*:1024-”,“连接,解析”);
PropertyPermission PropertyPermission=新的PropertyPermission(“*”,“读,写”);
FilePermission FilePermission=newfilepermission(“,“read”);
perms.add(socketPermission);
perms.add(propertyPermission);
perms.add(filePermission);
}
}

类MyPermissionCollection扩展了PermissionCollection{ 私有静态最终长serialVersionUID=614300921365729272L; ArrayList perms=新的ArrayList(); 公共作废添加(权限p){ perms.add(p); } 公共布尔暗示(权限p){ for(迭代器i=perms.Iterator();i.hasNext();){ 如果(((许可)i.next()).暗示(p)){ 返回true; } } 返回false; } 公共枚举元素(){ 返回集合。枚举(perms); } 公共布尔值isReadOnly(){ 返回false; } } 因为您的

new AllPermission()).newPermissionCollection()

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;
    }
}
短解 将更新的解决方案扩展到:

public class MyPolicy extends Policy
{
    @Override
    public PermissionCollection getPermissions(CodeSource codesource)
    {
        Permissions p = new Permissions();
        p.add(new AllPermission());
        return p;
    }
}
请考虑,它必须始终返回一个可变的PermissionCollection

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

此解决方案已经可以工作了,因为它将AllPermission对象添加到
策略.getPermissions(ProtectionDomain)
的每个调用中,该调用引用
策略.getPermissions(CodeSource)

清洁溶液 但是有一个更干净的解决方案,它不跟踪任何不必要的其他权限,因为AllPermissions已经允许了几乎所有的东西

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;
    }
}
公共类MyPolicy扩展策略
{
私有静态类AllPermissionsSingleton扩展PermissionCollection
{
私有静态最终长serialVersionUID=1L;
私有静态最终向量ALL_PERMISSIONS_Vector=新向量(Arrays.asList(new AllPermission());
@凌驾
公共作废添加(权限)
{
}
@凌驾
公共布尔暗示(权限)
{
返回true;
}
@凌驾
公共枚举元素()
{
返回所有_权限_VECTOR.elements();
}
@凌驾
公共布尔值isReadOnly()
{
返回false;
}
}
private static final allpermissionsingleton ALL_PERMISSIONS_SINGLETON=new allpermissionsingleton();
@凌驾
公共权限集合getPermissions(CodeSource CodeSource)
{
返回所有\u权限\u单例;
}
}

我必须使用代码库功能。所以我确实需要它。我希望用自定义的
java.security.policy
来替换策略文件,该文件包含
AllPermissionCollection
。这样行吗?需要覆盖什么才能使其工作?@AdelBoutros如果你使用代码库功能,你肯定不想授予AllPermission。您将从源代码运行代码。您需要构造一个适当的.policy文件,该文件完全授予您认为下载的代码应该需要的权限,而不授予其他权限。您可以通过-Djava.security.debug=access,failure中的一点helpmfr来确定这一点。我已经知道如何创建策略文件。这不是我想要的,因为我的应用程序是一个Eclipse插件,因此您无法将策略文件添加到单个Eclipse插件中,您需要将其添加到
Eclipse.ini
中,客户端将很难找到它accept@AdelBoutros你别无选择。没有办法做你想做的事。在任何情况下,我建议您的客户会发现更难接受RMI产品
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;
    }
}
public class MyPolicy extends Policy
{
    @Override
    public PermissionCollection getPermissions(CodeSource codesource)
    {
        Permissions p = new Permissions();
        p.add(new AllPermission());
        return p;
    }
}
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;
    }
}