crocelu
25-09-2010, 13:53
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
l eccezione sollevata è questa
java.security.AccessControlException: access denied (java.io.FilePermission C:\l uca.txt read) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkRead(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at TestClass.leggifile(TestClass.java:39) at Test.main(Test.java:27)
come dicevo riguarda il permesso di apertura in lettura del file.
Per completezza posto le classi dell applicazione
myclassLoader : questa classe estende il class loader e istanzia la classe TestClass con un dominio di protezione nel quale vi è (in teoria ) il permesso di aprire il 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;}
}
la classe caricata TestClass che appunto prova , tra altre cose , prova ad aprire il file in questione generando la suddetta eccezione
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.Passworld);
System.out.println("Connesso al db");
Thread.sleep(100);
// SQL statements processing object
Statement stmt = con.createStatement();
String query = "SELECT nome FROM Prova.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();
}
}
la classe Test che implementa un main e si occupa di istanziare un myclassloader che caricherà la class TestClass . L 'oggetto di tale classe lancerà diversi metodi tra i quali leggifile() che provoca appunto l ' eccezzione
/* 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() ;
}
}
}
a queste classi si aggiungono delle altre come un collezione di permessi PermitionCollection e un interfaccia myinterface implementata appunto TestClass .
Il file di policy personale che viene caricato ha "per il momento" il seguente contento :
grant {permission java.lang.RuntimePermission "createClassLoader";}; grant codeBase "file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class " {permission java.io.FilePermission "C:\\luca.txt" , "read";};
e per finire vi posto anche il comando con il quale lancio l applicazione ...tanto per essere completi
C:\Users\db2admin\workspace\Base\src>java -Djava.security.manager -Djava.securit
y.policy=mypolicy.policy Test
Utilizzo di myClassLoader.
Caricamento della classe : TestClass
Non e' una classe di sistema.
Lettura dati da file per la classe TestClass
file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class
C:\Users\db2admin\workspace\Base\src\arch\TestClass.class
Caricamento della classe : myInterface
Classe di sistema (CLASSPATH)
Caricamento della classe : java.lang.Object
eccc...........sino all accezione !!
Spero fortemente che qualcuno mi aiuti....spero inoltre di essere stato chiaro ed aver rispettato i requisiti
ciaoooo
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
l eccezione sollevata è questa
java.security.AccessControlException: access denied (java.io.FilePermission C:\l uca.txt read) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkRead(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at TestClass.leggifile(TestClass.java:39) at Test.main(Test.java:27)
come dicevo riguarda il permesso di apertura in lettura del file.
Per completezza posto le classi dell applicazione
myclassLoader : questa classe estende il class loader e istanzia la classe TestClass con un dominio di protezione nel quale vi è (in teoria ) il permesso di aprire il 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;}
}
la classe caricata TestClass che appunto prova , tra altre cose , prova ad aprire il file in questione generando la suddetta eccezione
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.Passworld);
System.out.println("Connesso al db");
Thread.sleep(100);
// SQL statements processing object
Statement stmt = con.createStatement();
String query = "SELECT nome FROM Prova.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();
}
}
la classe Test che implementa un main e si occupa di istanziare un myclassloader che caricherà la class TestClass . L 'oggetto di tale classe lancerà diversi metodi tra i quali leggifile() che provoca appunto l ' eccezzione
/* 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() ;
}
}
}
a queste classi si aggiungono delle altre come un collezione di permessi PermitionCollection e un interfaccia myinterface implementata appunto TestClass .
Il file di policy personale che viene caricato ha "per il momento" il seguente contento :
grant {permission java.lang.RuntimePermission "createClassLoader";}; grant codeBase "file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class " {permission java.io.FilePermission "C:\\luca.txt" , "read";};
e per finire vi posto anche il comando con il quale lancio l applicazione ...tanto per essere completi
C:\Users\db2admin\workspace\Base\src>java -Djava.security.manager -Djava.securit
y.policy=mypolicy.policy Test
Utilizzo di myClassLoader.
Caricamento della classe : TestClass
Non e' una classe di sistema.
Lettura dati da file per la classe TestClass
file:/C:/Users/db2admin/workspace/Base/src/arch/TestClass.class
C:\Users\db2admin\workspace\Base\src\arch\TestClass.class
Caricamento della classe : myInterface
Classe di sistema (CLASSPATH)
Caricamento della classe : java.lang.Object
eccc...........sino all accezione !!
Spero fortemente che qualcuno mi aiuti....spero inoltre di essere stato chiaro ed aver rispettato i requisiti
ciaoooo