2009-04-17 15 views
16

¿Hay alguna manera de deshabilitar completamente el administrador de seguridad de Java?
Cómo deshabilitar el administrador de seguridad de Java?

Estoy experimentando con el código fuente de db4o. Utiliza la reflexión para persistir objetos y parece que el administrador de seguridad no permite que la reflexión lea y escriba campos privados o protegidos.

Mi código:

public static void main(String[] args) throws IOException { 
    System.out.println("start"); 
    new File(DB_FILE_NAME).delete(); 
    ObjectContainer container = Db4o.openFile(DB_FILE_NAME); 
    String ob = new String("test"); 
    container.store(ob); 
    ObjectSet result = container.queryByExample(String.class); 
    System.out.println("retrieved (" + result.size() + "):"); 
    while(result.hasNext()) { 
     System.out.println(result.next()); 
    } 
    container.close(); 
    System.out.println("finish"); 
} 

Salida:

 
start 
[db4o 7.4.68.12069 2009-04-18 00:21:30] 
AccessibleObject#setAccessible() is not available. Private fields can not be stored. 
retrieved (0): 
finish 


This thread sugiere modificar el archivo java.policy para permitir la reflexión, pero no parece funcionar para mí. JVM

estoy empezando con argumentos
-Djava.security.manager -Djava.security.policy==/home/pablo/.java.policy
archivo de política de modo específico será el único archivo de política utilizada

El archivo tiene el siguiente aspecto:

 
grant { 
    permission java.security.AllPermission; 
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; 
}; 

yo pasamos 3 últimas horas de esto y no tengo ninguna idea de cómo hacer que esto funcione. Cualquier ayuda apreciada.

+0

¿Ha intentado llamar a setAccessible u otras acciones privilegiadas desde su propio código? –

+0

La línea de comando completa también puede ser útil. –

+1

¿Son los argumentos de su VM correctos? ¿Parece tener -Djava.security.policy ==? –

Respuesta

5

¿Realmente tiene dos signos '=' en la opción de línea de comando java.security.policy? Eso no funcionará Asegúrese de que está configurando la propiedad como

-Djava.security.policy=/home/pablo/.java.policy 

Para desactivar la realidad SecurityManager, simplemente dejando fuera de la propiedad java.security.manager sistema completo debería ser suficiente.


Actualización: Como yo estaba leyendo la documentación de los archivos de política para aprender más acerca de la "==" sintaxis, me di cuenta de que a menos que el archivo de política está en el directorio de trabajo actual, que necesita ser especificada como una URL (incluido el esquema). ¿Has probado el prefijo de la ruta de la política con el esquema "file:"?

También me desconcertó porque (suponiendo que se ejecute como usuario "pablo"), parece que esa política debería cargarse de forma predeterminada desde su directorio personal, por lo que no debería necesitar especificarla en absoluto. Por otro lado, si no está ejecutándose como el usuario "pablo", tal vez el archivo no sea legible.

+4

Eso no funciona. Tampoco pasa ningún argumento a JVM. BTW '==' significa que el archivo especificado será el único archivo utilizado. Single '=' significa que el archivo se usará junto con los archivos de política estándar. Al menos eso es lo que he leído. –

6

Usted podría intentar agregar esto a la principal() de su programa:

System.setSecurityManager(null); 

trabajado para mí para una aplicación Web Start "de confianza" cuando estaba teniendo problemas de controlador de seguridad. No estoy seguro si funcionará para su caso db4o, pero podría valer la pena intentarlo.

EDITAR: No estoy sugiriendo que esta sea una solución general a los problemas del administrador de seguridad. Lo estaba proponiendo como una forma de ayudar a depurar el problema del cartel original. Claramente, si desea beneficiarse de un administrador de seguridad, entonces no debe deshabilitarlo.

+1

Por lo general, no se recomienda, ya que puede ser utilizado por código malicioso para eliminar la seguridad y obtener privilegios de usuario local. –

+8

¡El póster original * está * buscando 'deshabilitar completamente' el administrador de seguridad! :-) –

+0

No funciona:/gracias de todos modos –

4

Encontré este ejemplo de cómo make private fields and methods accessible en su código. Básicamente, destila hasta el uso del campo .setAccessible (verdadero) y Method.setAccessible (verdadero) ejemplo

Campo: ejemplo

Field privateStringField = PrivateObject.class. 
      getDeclaredField("privateString"); 

privateStringField.setAccessible(true); 

Método:

Method privateStringMethod = PrivateObject.class. 
     getDeclaredMethod("getPrivateString", null); 

privateStringMethod.setAccessible(true); 

También puede buscar en el uso maravilloso con su código Java como (actualmente) elude muchas de las restricciones de nivel de acceso del código Java. Aunque, esta publicación de la pizarra de mensajes parece sugerir esta 'característica' may change in future versions of Groovy.

+7

Al deshabilitar el administrador de seguridad, obtiene permiso para llamar a setAccessible (verdadero). Sin deshabilitar al gerente de seguridad, no tendrías una oración. – extraneon

+0

@Kevin: Puedo llamar a setAccesible para campos privados en mi propio código. Y con 'mi propio código' me refiero a una clase que agregué a fuentes db4o. –

+0

Debería poder invocarlo en su código siempre que no lo esté ejecutando en un subprograma o en otro entorno con un administrador de seguridad contradictorio como lo sugiere (+1) @extraneon. Esta publicación artima tiene una buena explicación de Java Security Manager: http://www.artima.com/underthehood/securitymanager.html –

Cuestiones relacionadas