tipos - manejo de archivos en java netbeans
Limitar el acceso a archivos en Java (1)
Aquí es cómo puede hacerlo utilizando un archivo de política.
Cree un archivo Java que pueda actuar con privilegios:
package egPriv;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
public class PrivCat {
/** Cat a file with no privileges */
public void cat(String file) throws IOException {
cat(new FileReader(file));
}
private void cat(Reader r) throws IOException {
int c;
while( (c = r.read()) != -1 ) {
System.out.print((char) c);
}
r.close();
}
/** Cat a file WITH privileges */
public void catPriv(final String file) throws IOException {
Reader r;
try {
r = AccessController.doPrivileged(new PrivilegedExceptionAction<Reader>() {
public Reader run() throws IOException {
return new FileReader(file);
}
});
} catch (PrivilegedActionException e) {
throw (IOException) e.getCause();
}
cat(r);
}
}
Crear un archivo regular para demostrar
package eg;
import egPriv.PrivCat;
import java.io.IOException;
public class Cat extends PrivCat {
public static void main(String[] args) throws IOException {
Cat eg2 = new Cat();
System.out.println("Processing with privilege:");
eg2.catPriv(args[0]);
System.out.println("Processing normally");
eg2.cat(args[0]);
}
}
Crear archivo sample.policy:
/* anyone can read write and execute within current working dir */
grant {
permission java.io.FilePermission "${user.dir}", "read,write,execute";
};
grant {
permission java.io.FilePermission "${user.dir}/*", "read,write,execute,delete";
};
/* Only code from this jar can work outside of CWD */
grant codebase "file:egPriv.jar" {
permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete";
};
Compilar y luego probar:
jar cvf egPriv.jar egPriv
jar cvf eg.jar eg
echo ''Restricted'' > ../file.txt
java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy eg.Cat ../file.txt
echo ''Open'' > file.txt
java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy eg.Cat file.txt
Problema:
En mi aplicación Java (no en un applet) deseo limitar ciertas operaciones de archivo a todas las clases, excepto a una lista / grupo / paquete de clases que no deben restringirse.
Específicamente, me gustaría limitar ...
- Archivo lee
- Archivo escribe
- Creación de archivos
- Eliminación de archivos
... de tal manera que solo se pueden hacer dentro del directorio de trabajo actual para todas las clases, excepto las no restringidas.
Intento del gestor de seguridad:
He intentado implementar una subclase de la clase SecurityManager que implementa este comportamiento, sin embargo, parece que cuando se realizan las comprobaciones, la información del archivo proporcionada no proporciona más que solo el nombre de archivo (a menos que me falte algo).
Además, no entiendo bien cómo, en este caso, podría averiguar la clase desde la cual se realiza la llamada, para poder determinar si debo permitir la operación o lanzar una excepción. ¿Hay alguna manera de que pueda obtener toda la información que necesito para que este enfoque funcione?
Intento basado en la política:
También soy consciente de que las políticas de Java están destinadas a restringir las acciones de las clases, incluidas cosas como las operaciones de archivos. Sin embargo, me ha costado mucho encontrar un buen recurso para saber cómo podría solucionar mis problemas con un archivo .policy .
Resumen de la pregunta:
1) ¿Existen enfoques alternativos que puedan ser preferibles a los que he mencionado?
2) ¿Es esto posible utilizando un SecurityManager? ¿Me estoy perdiendo cómo debo implementar este enfoque?
3) ¿Es esto posible usando un archivo de política? ¿Hay algún buen recurso que me haya perdido en este frente?
Realmente no me opongo a la cantidad de trabajo arduo que necesito invertir para lograrlo; simplemente no estoy seguro de cómo enfocarlo adecuadamente. También me faltan recursos para enseñarme lo suficiente sobre los dos enfoques posibles que he mencionado, para que pueda implementarlo yo mismo. Por encima de todo, no tengo miedo de la lectura significativa donde se requiere!
Gracias por cualquier ayuda que puedas dar, por adelantado.