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