如何以编程方式授予AllPermissions
到RMI应用程序,而无需使用策略文件?
更新:
一些经过研究,我写了这个定制的策略类,并通过安装它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();
}
}
基于@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;
}
}
因为你的
新的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;
}
}
不安装安全管理器。 你只需要它,如果你使用的代码库的功能,如果你需要,你需要一个适当的.policy文件,
简短的解决方案
扩展您的更新的解决方案:
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;
}
}