Ciao a tutti...Sto realizzando (ci sto sbattendo la testa) un metodo per il controllo dell accesso java basato sui Ruoli. Ora sono ancora alle fasi preliminari e ho incontrato dei problemi per i permessi.
Ho creato un classLoader MYClassLoader che carica una classe TestClass.class allla quale verra associata anche un dominio di protezione con il permesso di leggere un file

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.AccessController;
import java.security.CodeSource;
import java.security.Permission;
import java.security.ProtectionDomain;
import java.security.SecureClassLoader;
import java.util.Hashtable;
import java.util.StringTokenizer ;

public class myClassLoader extends ClassLoader {
private Hashtable classes = new Hashtable();
protected String path ;
protected String extension ;
protected ProtectionDomain domain;
protected URL url=null;


public myClassLoader( String path, String extension) {
this.path = path ;
this.extension = extension ;

}

/* Carica il contenuto di un file .class */
private byte getClassBytes(String className)[] {
System.out.println("Lettura dati da file per la classe "+className);
byte result[];
try {
result = loadClassBytes( className ) ;

return result;
} catch (Exception e) {
return null;
}
}

private byte[] loadClassBytes(String className) throws MalformedURLException {
// System.out.println("Lettura dati da file per la classe " +
// classname);
String name="C:\\Users\\db2admin\\workspace\\Base\\src\\" +path+ "\\" +className + "." + extension;
File classfile= new File (name);
URL url=classfile.toURI().toURL();
System.out.println(url.toString());
System.out.println(name);
byte result[] = null;
FileInputStream fi = null;
try {
fi = new FileInputStream(classfile);

result = new byte[(int) classfile.length()];
fi.read(result);
} catch (Exception e) {
result = null;
} finally {
try {
fi.close();
} catch (Exception ex) {
}
}
return result;
}

/* Questa e' la versione chiamata */
public Class loadClass(String className) throws ClassNotFoundException {
return (loadClass(className, true));
}

/* Questa e' la versione completa */
public synchronized Class loadClass(String className, boolean resolveIt)
throws ClassNotFoundException {
Class result;
byte classData[];

System.out.println("Caricamento della classe : "+className);

/* Prima si controlla la cache */
result = (Class)classes.get(className);
if (result != null) {
System.out.println("Utilizzata la copia nella cache.");
return result;
}

/* Prima si prova col primordial class loader */
try {
result = super.findSystemClass(className);
System.out.println("Classe di sistema (CLASSPATH)");
return result;
} catch (ClassNotFoundException e) {
System.out.println("Non e' una classe di sistema.");
if ( className.startsWith( "java.") ) {
System.out.println("Classe pericolosa : " + className ) ;
System.out.println( "Caricamento abortito" ) ;
throw new ClassNotFoundException();
}
}

/* poi si prova a caricare la classe dal path specificato */
classData = getClassBytes(className);
if (classData == null) {
throw new ClassNotFoundException();
}

this.domain=generadominio(className);
/* viene eseguito il parsing, e costruito l'oggetto class */
result = defineClass(className,classData, 0, classData.length,this.domain);
if (result == null) {
throw new ClassFormatError();
}

if (resolveIt) {
resolveClass(result);
}

/* Si aggiorna la cache */
classes.put(className, result);
System.out.println("Classe caricata : " +className);
return result;
}

private ProtectionDomain generadominio(String classname){
java.security.cert.Certificate[] c=null;
CodeSource cs=new CodeSource (url, c);

Permission p1 = new FilePermission("C:\\luca.txt", "read");


//AccessController.checkPermission(p1);
TestPermissionCollection p= new TestPermissionCollection();
p.add(p1);
ProtectionDomain d=new ProtectionDomain (cs , p);
return d;}
}


ovviamente c è un main che istanzia il classloader...ma quando la classe TestClass caricata prova ad aprire in lettura il file C:\\luca.txt il controller dell accesso mi dice accesso negato , nonostante il permesso sia nel propio dominio di protezione e nel file policy da me creato

grant codeBase "file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class " {permission java.io.FilePermission "C:\\luca.txt" , "read";};

stringa in questione.

Perchèè?????? le ho provate di tutte ma niente...forse il class loader non associa bene la classe al dominio di protezione...bo non saprei..!
per completezza vi allego il codice il main è nella classe Test

Spero che qualcuno mi possa aiutareeeeee
please


questo è il main
/* Esempio di utilizzo di myClassLoader */
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilePermission;
import java.io.IOException;
import java.io.InputStreamReader;


public class Test {
public static void main( String args[] ) throws IOException {

myClassLoader classLoader = new myClassLoader( "arch", "class" ) ;
Object o ;
String tst = "TestClass" ;
// String tst = "java.Virus" ;

System.out.println( "Utilizzo di myClassLoader." ) ;

if ( args.length != 0 )
tst = args[0] ;

try {
o = (classLoader.loadClass(tst)).newInstance() ;

((myInterface) o).start("niente") ;
((myInterface) o).leggifile();
((myInterface) o).creaConnection();
} catch (Exception e ) {
e.printStackTrace() ;
}

}
}
questa il .java della classe da caricare

import java.sql.Statement;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.* ;

public class TestClass implements myInterface {
// viene caricata la classe Vector
Vector v = new Vector() ;
TestConnection c;
public java.sql.Connection con;
// Fa parte dell'interfaccia myInterface
public void start( String opt ) {
// Ancora non viene caricata la classe
Hashtable ht ;

System.out.println("TestClass "+ opt);
System.out.println( "Istanzio una hashtable" ) ;

// adesso viene caricata la classe Hashtable
ht = new Hashtable() ;

for (int i=0 ; i < 5; i++ )
v.addElement( new Integer( i ) );

// Non viene ricaricata la classe
ht = new Hashtable() ;

for( int i = 0 ; i < v.size() ; i++ ) {
Integer z = (Integer) v.elementAt(i) ;
System.out.println( i + ": " + z ) ;
}
}
public void leggifile() throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader (
new FileInputStream("C:\\luca.txt")));
String linea = br.readLine();
System.out.println(linea);
}
public void creaConnection () throws ClassNotFoundException, SQLException, InterruptedException
{
c =new TestConnection();
java.lang.Class.forName(c.Driver);
con = DriverManager.getConnection(c.URL,c.User,c.Passwor ld);

System.out.println("Connesso al db");
Thread.sleep(100);
// SQL statements processing object
Statement stmt = con.createStatement();
String query = "SELECT nome FROM prova";
// submit the SQL query, get result set

ResultSet rs = stmt.executeQuery( query );
while ( rs.next() )
{
// get field values by field name
String nome = rs.getString("nome");

System.out.println("il nome "+nome);
}

con.close();

}
}