Instalar un Controlador de Seguridad
Una vez que has terminado de escribir tu subclase de SecurityManager, puedes instalarla como el
controlador de seguridad actual de tu aplicaicón. Puedes hacer esto utilizando el método
setSecurityManager() de la clase System.
Aquí tienes una pequeña aplicación de prueba,
SecurityManagerTest, que
instala la clase PasswordSecurityManager de la
página anterior como el controlador
de seguridad actual. Luego, para verificar que el controlador de seguridad está en su lugar y
es operacional, esta aplicación abre dos ficheros -- uno para leer y otro para escribir -- y
copia el contenido del primero en el segundo.
El método main() comienza con la instalación de nuevo controlador de
seguridad.
try {
System.setSecurityManager(new PasswordSecurityManager("Booga Booga"));
} catch (SecurityException se) {
System.out.println("SecurityManager already set!");
}
La línea en negrita del código anterior crea un nuevo ejemplar de la clase
PasswordSecurityManager con la password "Booga Booga". Este ejemplar es pasado al método
setSecurityManager() de la clase System, que instala el objeto como el
controlador de seguridad por defecto para la aplicación que se está ejecutando. Este
controlador de seguridad permanecerá efectivo durante el la ejecución de esta aplicación.
Sólo se puede seleccionar un vez el controlador de seguridad de una aplicación. En otras
palabras, una aplicación Java sólo pude invocar una vez a
System.setSecurityManager() durante su ciclo de vida. Cualquier intento
posterior de instalar un controlador de seguridad dentro de una aplicación Java resultará en
una SecurityException.
El resto del programa copia el contenido de este fichero
inputtext.txt en un
fichero de salida llamado outputtext.txt. Es sólo un texto que verifica que
PasswordSecurityManager se ha instalado de forma apropiada.
try {
DataInputStream fis = new DataInputStream(new FileInputStream("inputtext.txt"));
DataOutputStream fos = new DataOutputStream(new FileOutputStream("outputtext.txt"));
String inputString;
while ((inputString = fis.readLine()) != null) {
fos.writeBytes(inputString);
fos.writeByte('\n');
}
fis.close();
fos.close();
} catch (IOException ioe) {
System.err.println("I/O failed for SecurityManagerTest.");
}
Las líneas en negrita del código anterior son los accesos al sistema de ficheros restringido.
Estas llamadas a método resultan en una llamada al método checkAccess() del
PasswordSecurityManager.
Ejecutar el Programa de Prueba
Cuando ejecutes la aplicación SecurityManagerTest te pedirá dos veces la password: una cuando
la aplicación abre el fichero de entrada y otra cuando abre el fichero de salida. Si tecleas la
password correcta, se permite el acceso -- el objeto fichero -- y la aplicación prosigue con la
siguiente sentencia. Si tecleas una password incorrecta,
checkXXX() lanza una SecurityException, que la
aplicación no intenta capturar por lo que aplicación termina.
Este es un ejemplo de la salida de aplicación cuando se teclea la password correcta la primera
vez, pero no la segunda.
What's the secret password?
Booga Booga
What's the secret password?
Wrong password
java.lang.SecurityException: Not Even!
at PasswordSecurityManager.checkWrite(PasswordSecurityManager.java:46)
at java.io.FileOutputStream.<init>(FileOutputStream.java)
at SecurityManagerTest.main(SecurityManagerTest.java:15)
Observa que el mensaje de error que muestra la aplicación es el mensaje contenido en el método
checkWrite(String).
También puedes ver:
java.lang.System