La síntaxis del fichero de policía no se describe aquí; si estás interesado puedes ver Default Policy Implementation and Policy File Syntax en el web site de java.sun.com.
No necesitamos conocer la síntaxis, siempre podemos usar Policy Tool para crear ficheros de policía, como se muestra en las lecciones Visión Rápida para Controlar Applets, Visión Rápida para Controlar Aplicaciones, y Firmar Código y Conceder Permisos.
Abajo está el fichero de policía de ejemplo, seguida por una descripción de las entradas individuales. Asume que:
keystore "kim.keystore";
// Here is the permission TerrysGame needs.
// It grants code signed by "terry" the HighScorePermission, if the
// HighScorePermission was signed by "chris"
grant SignedBy "terry" {
permission com.scoredev.scores.HighScorePermission
"TerrysGame", signedBy "chris";
};
// Here is the set of permissions the HighScore class needs:
grant SignedBy "chris" {
// The HighScore class needs permission to read "user.home" to find
// the location of the highscore file
permission java.util.PropertyPermission "user.home", "read";
// It needs permission to read and write the high score file itself
permission java.io.FilePermission
"${user.home}${/}.highscore", "read,write";
// It needs to get granted its own permission,
// so it can call checkPermission
// to see if its caller has permission.
// Only grant it the permission
// if the permission itself was signed by "chris"
permission com.scoredev.scores.HighScorePermission
"*", signedBy "chris";
};
Un keystore es un repositorio de claves y certificados, y se usa para buscar las claves públicas de los firmantes especificados en el fichero de policía ("terry" y "chris" en este ejemplo).La utilidad keytool se utiliza para crear y administrar keystores.
Para esta lección, asumimos que Kim quiere jugar a TerrysGame. Si el keystore de Kim tiene el nombre de kim.keystore, el fichero de policía de Kim necesita tener la siguiente línea lo más al principio posible:
keystore "kim.keystore";
Una entrada de fichero de policía especifica uno o más permisos para el código de un código fuente particular - o bien código de una localización particular (URL) o código firmado por una entidad particular o ambos.Nuestro fichero de policía necesita una entrada para cada juego, concediendo al código firmado por el creador del juego un HighScorePermission cuyo nombre es el nombre del juego. Este permiso permite al juego llamar a los métodos HighScore para obtener o actualizar el valor de la máxima puntuación de un usuario en un juego particular.
La entrada requerida para TerrysGame es:
grant SignedBy "terry" { permission com.scoredev.scores.HighScorePermission "TerrysGame", signedBy "chris"; };Requerir que el juego TerrysGame esté firmado por "terry" permite a Kim saber que el juego es realmente el juego que desarrolló Terry. Para este trabajo, Kim debe terner almacenado el certificado de la clave pública de Terry en kim.keystore usando el alias "terry".Observa que HighScorePermission necesita estar firmado por "chris", la persona que realmente implementó el permiso. Esto asegura que a TerrysGame se le concede el permiso que realmente implementó "chris", y no el de otra persona. Como antes, para hacer esto Kim debe tener almacenado el certificado de la clave pública de Chris en kim.keystore usando el alias "chris".
La entrada final del fichero de policía concede pemriso a la clase HighScore. Más específiamente concede permiso al código firmado por "chris", que fue quien creo y firmó la clase. Requiriendo que la clase esté firmada por "chris" aseguramos que cuando TerrysGame llama esta clase para actualizar la puntuación máxima del usuario, TerrysGame da por seguro que está suando la clase original implementada por "chris".Para actualizar el valor de la puntuación máxima del usuario por cualquier juego que lo llame, la clase HighScore requiere tres permisos:
1. Permiso para leer el valor de la propiedad "user.home".
La clase HighScore almacena la puntuación máxima del usuario en un fichero .highscore en el directorio home del usuario. Por lo tanto está clase necesita un java.util.PropertyPermission que le permita leer el valor de la propiedad "user.home" para encontrar exáctamente dónde se encuenra el directorio home del usuario:permission java.util.PropertyPermission "user.home", "read";2. Permiso para leer y escribir el propio fichero de la máxima puntuación.
Este permiso se necesita porque los métodos getHighScore y setHighScore pueden acceder al fichero del usuario .highscore para obtener o seleccionar, respectivamente, el valor actual de la máxima puntuación del usuario en el juego actual.Aquí está el permiso requerido:
permission java.io.FilePermission "${user.home}${/}.highscore", "read,write";Nota: la notación ${propName} específica el valor de una propiedad. Así, ${user.home} será reempalzao por el valor de la propiedad "user.home". La notación ${/} es una forma independiente de la plataforma de identificar un separador de ficheros.3. Todos los HighScorePermissions (es decir, HighScorePermissions de cualquier nombre).
Este permiso es necesario para que la HighScore se asegure de que el juego llamante tiene concedido un HighScorePermission cuyo nombre es el nombre del juego para el que trabaj. Es decir, la clase HighScore también debe conceder este permiso, ya que un chequeo de permiso requiere que todo el código que hay en la pila tenga el permiso específicado.Aquí está el permiso requerido:
permission com.scoredev.scores.HighScorePermission "*", signedBy "chris";Como antes, el propio HighScorePermission necesita estar firmado por "chris", la persona que realmente implementó el permiso.