Escribir un Controlador de Seguridad
Para escribir tu propio controlador de seguridad, debes crear una subclase de la clase
SecurityManager. Esta subclase sobreescribe varios métodos de SecurityManager para personalizar
las varificaciones y aprobaciones necesarias para una aplicación Java.
Esta página te lleva a través de un controlador de seguridad de ejemplo que restringe la lectura
y escritura en el sistema de ficheros. Para obtener la aprobación del controlador de seguridad,
un método que abra un fichero para leer invoca uno de los métodos
checkRead() de SecurityManager, un método que abre un fichero para escribir
invoca a uno de los métodos checkWrite() se SecurityManager. Si el
controlador de seguridad aprueba la operación el método
checkXXX() retorna nomalmente, de otra forma
checkXXX() lanza una SecurityException.
Para imponer una política restrictiva en los accesos al sistema de ficheros, nuestro ejemplo
debe sobreescribir los métodos checkRead() y
checkWrite() de SecurityManager. SecurityManager proporciona tres versiones
de checkRead() y dos versiones de checkWrite(). Cada
una de ellas debería verificar si la aplicación puede abrir un fichero para I/O. Una política
implementada frecuentemente en los navegadores para que los applets cargados a través de la red
no puedan leer o escribir en el sistema local de ficheros a menos que el usuario lo apruebe.
La política implementada por nuestro ejemplo le pide al usuario una password cuando la
aplicación intenta abrir un fichero para leer o escribir. Si la password es correcta se permite
el acceso.
Todos los controladores de seguridad deben ser una subclase de SecurityManager. Así, nuestra
PasswordSecurityManager
desciende de SecurityManager.
class PasswordSecurityManager extends SecurityManager {
. . .
}
Luego, PasswordSecurityManager declara un ejemplar de la variable privada
password para contener el password que el usuario debe introducir para
poder permitir el acceso al sistema de ficheros restringido. La password se selecciona durante
la construcción.
PasswordSecurityManager(String password) {
super();
this.password = password;
}
El siguiente método en la clase PasswordSecurityManager es un método de ayuda privado llamado
accessOK(). Este método le pide al usuario una password y la verifica. Si
el usuairo introduce una password válida, el método devuelve true, de otra forma devuelve false.
private boolean accessOK() {
int c;
DataInputStream dis = new DataInputStream(System.in);
String response;
System.out.println("What's the secret password?");
try {
response = dis.readLine();
if (response.equals(password))
return true;
else
return false;
} catch (IOException e) {
return false;
}
}
Finalmente al final de la clase PasswordSecurityManager hay tres métodos
checkRead() y dos métodos checkWrite() sobreescritos.
public void checkRead(FileDescriptor filedescriptor) {
if (!accessOK())
throw new SecurityException("Not a Chance!");
}
public void checkRead(String filename) {
if (!accessOK())
throw new SecurityException("No Way!");
}
public void checkRead(String filename, Object executionContext) {
if (!accessOK())
throw new SecurityException("Forget It!");
}
public void checkWrite(FileDescriptor filedescriptor) {
if (!accessOK())
throw new SecurityException("Not!");
}
public void checkWrite(String filename) {
if (!accessOK())
throw new SecurityException("Not Even!");
}
Todos los métodos checkXXX() llaman a
accessOK() para pedirle al usuario la password. Si el acceso
no es OK, entonces checkXXX()
lanza una SecurityException. De otra froma, checkXXX()
retorna normalmente. Observa que SecurityException es una excepción en tiempo de ejecución, y
no necesita ser declarada en la clausula throws de estos métodos.
checkRead() y checkWrite() son sólo unos pocos de los
muchos métodos checkXXX() de SecurityManager que
verifican varias clases de operaciones. Puedes sobreescribir o añadir cualquier número de métodos
checkXXX() para implementar tu propia política de
seguridad. No necesitas sobreescribir todos los métodos
checkXXX() de SecurityManager, sólo aquellos que
quieras personalizar. Sin embargo, la implementación por defecto proporcionada por la clase
SecurityManager para todos los métodos checkXXX()
lanza una SecurityException. En otras palabras, por defecto, la clase SecurityManager prohibe
todas las operaciones que están sujetas a las restricciones de seguridad. Por lo que podrías
encontrar que tienes que sobreescribir muchos métodos
checkXXX() para obtener el comportamiento deseado.
Todos los métodos checkXXX() de la clase
SecurityManager operan de la misma forma.
- Si el acceso está permitido, el método retorna.
- Si el acceso no está permitido, el método lanza una SecurityException.
Asegurate de que implementas de esta forma tus métodos
checkXXX() sobreescritos.
Bien, esta es nuestra subclase de SecurityManager. Como puedes ver implementar un controlador de
seguridad es sencillo, sólo:
- Crea una subclase de SecurityManager.
- Sobreescribe unos cuantos métodos.
El truco está en determinar los métodos que se deben sobreescribir para implementar tu política
de seguridad. Decidir que Métodos Sobreescribir de
SecurityManager te ayudará a decidir los métodos que deberás sobreescribir
dependiendo de los tipos de operaciones que quieras proteger. La
página siguiente te enseña como
instalar la clase PasswordSecurityManager como el controlador de seguridad de su aplicación Java.
También puede ver
java.lang.SecurityManager
java.lang.SecurityException