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

如何以编程方式将AllPermissions授予RMI应用程序而不使用策略文件?

更新:

经过一番研究,我编写了这个自定义策略类并通过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(); } } 

基于@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());在我的应用程序启动时设置策略来以编程方式复制它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("<>", "read"); perms.add(socketPermission); perms.add(propertyPermission); perms.add(filePermission); } } 

 class MyPermissionCollection extends PermissionCollection { private static final long serialVersionUID = 614300921365729272L; ArrayList perms = new ArrayList(); public void add(Permission p) { perms.add(p); } public boolean implies(Permission p) { for (Iterator i = perms.iterator(); i.hasNext();) { if (((Permission) i.next()).implies(p)) { return true; } } return false; } public Enumeration elements() { return Collections.enumeration(perms); } public boolean isReadOnly() { return false; } } 

不要安装SecurityManager。 如果您正在使用代码库function,则只需要它,如果需要,则需要正确的.policy文件,

因为你的

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

简短解决方案

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

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

考虑一下, Policy.getPermissions()必须始终返回可变的 PermissionCollection

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

此解决方案已经可以使用,因为它在Policy.getPermissions(ProtectionDomain)每个调用中添加了一个AllPermission对象,该调用引用Policy.getPermissions(CodeSource)

清洁解决方案

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

 public class MyPolicy extends Policy { private static class AllPermissionsSingleton extends PermissionCollection { private static final long serialVersionUID = 1L; private static final Vector ALL_PERMISSIONS_VECTOR = new Vector(Arrays.asList(new AllPermission())); @Override public void add(Permission permission) { } @Override public boolean implies(Permission permission) { return true; } @Override public Enumeration 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; } }