Newsgroup: it.comp.java
Titolo: RMI e Sicurezza

Ho il seguente problema che spero che qualcuno mi possa risolvere;
Programma di Boot:
------------------------------
public class Boot {
public static void main(String args[]) {
  System.setSecurityManager(new java.rmi.RMISecurityManager());
System.getProperties().put("java.rmi.server.hostname","
http://xxx/xxx/
");
 try {
    java.net.URL url = new java.net.URL("
http://xxx/xxx/
");
  Class cl = java.rmi.server.RMIClassLoader.loadClass(url,"Agente");
  Runnable client = (Runnable)cl.newInstance();
  client.run();
 } catch (Exception e) {
  System.out.println("Exception: " + e.getMessage());
  e.printStackTrace();
 }
}
}
-------------------------------------
la classe Agente che viene caricata dalla rete apre un socket usando
RMI. Questo genera problemi alla sicurezza implementata da
RMISecurityManager() e ho la seguente eccezione:
java.security.AccessControlException: access denied
(java.util.PropertyPermission * read,write)
 at java.security.AccessControlContext.checkPermission(Compiled Code)
 at
java.security.AccessController.checkPermission(AccessController.java:403)
 at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
 at
java.lang.SecurityManager.checkPropertiesAccess(SecurityManager.java:1194)
 at java.lang.System.getProperties(System.java:451)
 at Boot.main(Boot.java:7)
Come posso risolvere il problema?
Grazie e buon anno,
Marco

 RMISecurityManager() e ho la seguente eccezione:
Invece dell'RMI, che probabilmente continuerà a crearti ulteriori
problemi con la sicurezza, potresti utilizzare un URLClassLoader:
// Questa classe si occupa del class loading esteso alla rete. Utilizza
il protocollo
// HTTP, quindi il server deve avere un processo che si occupi della
gestione di tali
// richieste.
import java.io.*;
import java.net.*;
import java.util.Hashtable;
public class URLClassLoader extends ClassLoader {
  private Hashtable cache;
  private URL u;
  public URLClassLoader(String classPath) throws Exception {
    try {
      this.u = new URL(classPath);
    } catch (MalformedURLException e) {
      throw new Exception(classPath + " seems to be an invalid URL");
    } catch (Exception e) {
      throw e;
    }
    cache = new Hashtable();
  }
  public synchronized Class loadClass (String name, boolean resolve)
throws ClassNotFoundException {
    Class c;
    try {
      c = super.loadClass(name, resolve);
      return c;
    } catch (ClassNotFoundException e) {
    }
    c = (Class)cache.get(name);
    if (c==null) {
      try {
        c = findSystemClass(name);
      } catch (ClassNotFoundException e) {
      }
    }
    if (c==null) {
      byte b[] = loadClassData(name);
      c = defineClass(name, b, 0, b.length);
      cache.put(name, c);
      if (resolve)
        resolveClass(c);
    }
    return c;
  }
  private byte[] loadClassData(String name) throws
ClassNotFoundException {
    byte[] b = null;
    InputStream theClass = null;
    int buffSz = 128;
    byte[] buff = new byte[buffSz];
    try {
      URL classURL = new URL(u, name + ".class");
      URLConnection uc = classURL.openConnection();
      uc.setAllowUserInteraction(false);
      theClass = uc.getInputStream();
      int cl = uc.getContentLength();
      if (cl == -1)
        b = new byte[buffSz * 16];
      else
        b = new byte[cl];
      int bytesRead = 0;
      int offset = 0;
      while (bytesRead >= 0) {
        bytesRead = theClass.read(buff, 0, buffSz);
        if (bytesRead == -1)
          break;
        System.arraycopy(buff, 0, b, offset, bytesRead);
        offset += bytesRead;
        if (offset == b.length) {
          if (cl != -1)
            break;
          else {
            byte[] temp = new byte[offset * 2];
            System.arraycopy(b, 0, temp, 0, offset);
            b = temp;
          }
        }
        else if (offset > b.length)
          throw new ClassNotFoundException(name + "error reading data");
      }
      if (offset < b.length) {
        byte[] temp = new byte[offset];
        System.arraycopy(b, 0, temp, 0, offset);
        b = temp;
      }
      if (cl != -1 && offset != cl)
        throw new ClassNotFoundException("Only " + offset + " bytes
received for " + name + " instead of " + cl);
    } catch (Exception e) {
      throw new ClassNotFoundException(e.getMessage());
    }
    return b;
  }
}