Está en la página 1de 5

Ejercicios - Transacciones y seguridad

Índice
1 Seguridad........................................................................................................................... 2
2 Transacciones (*)............................................................................................................... 4

Copyright © 2005 Depto. CCIA All rights reserved.


Ejercicios - Transacciones y seguridad

En esta sesión vas a realizar dos ejercicios, uno en el que compruebes paso a paso algunas
posibilidades de seguridad de los EJB y otro en el que se muestra un ejemplo de utilización
de las transacciones.
Vamos a usar el bean ReservasBean desarrollado en la sesión 3. Para probar las
transacciones necesitaremos usar la parte optativa de la sesión 3, en la que el bean actualiza
la reserva en la base de datos.

1. Seguridad

En este ejercicio vamos a comprobar cómo es posible restringir el acceso a uno o más
métodos de un bean. Vamos a usar el proyecto sesion3-beans, no hace falta crear un
proyecto nuevo.
1. Modifica en el descriptor de despliegue ejb-jar.xml los datos de seguridad del acceso
al bean ReservasBean, para restringir el acceso al método realizaReserva() al rol
PuedeHacerReservas. Para ello debes incluir las siguientes declaraciones después de la
parte enterprise-beans del descriptor:
<assembly-descriptor>
<security-role>
<role-name>PuedeHacerReservas</role-name>
</security-role>
<method-permission>
<role-name>PuedeHacerReservas</role-name>
<method>
<ejb-name>ReservasBean</ejb-name>
<method-name>realizaReserva</method-name>
</method>
</method-permission>
</assembly-descriptor>
]
2. Redespliega el bean y prueba el cliente. Te deberá dejar que ejecutes cualquier método en
el bean, excepto el método realizaReserva, con el que dará una excepción.
3. Modifica el descriptor de despliegue weblogic-ejb-jar.xml para asociar el rol
PuedeHacerReservas con el grupo UsuarioBiblioteca como se muestra a
continuación. Redespliega el bean.
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
...
</weblogic-enterprise-bean>
<security-role-assignment>
<role-name>PuedeHacerReservas</role-name>
<principal-name>UsuarioBiblioteca</principal-name>
</security-role-assignment>

2
Copyright © 2005 Depto. CCIA All rights reserved.
Ejercicios - Transacciones y seguridad

</weblogic-ejb-jar>
Despliega el directorio. Comprueba en la pestaña Security-ModuleScope que se ha
actualizado correctamente el rol:

4. Crea en el servidor de aplicaciones el grupo "UsuarioBiblioteca" y asóciale un usuario


concreto (por ejemplo "j2ee" con contraseña "j2eej2ee"). Para ello usa la opción
SecurityRealms-User and Groups
5. Modifica el programa cliente para que se conecte al servidor de aplicaciones
autentificándose como el usuario que has creado. Para ello, añade el código

3
Copyright © 2005 Depto. CCIA All rights reserved.
Ejercicios - Transacciones y seguridad

p.put(Context.SECURITY_PRINCIPAL, "j2ee" );
p.put(Context.SECURITY_CREDENTIALS, "j2eej2ee");
en el programa ReservasClient, justo después de la línea

p.put(Context.PROVIDER_URL, "t3://localhost:7001");
Vuelve a lanzar el cliente. ¡¡Ahora ya debe funcionar!!

2. Transacciones (*)

El objetivo de este ejercicio es probar el funcionamento de las transacciones. Para ello


necesitamos tener implementado el método realizaReservas() del bean
ReservasBean. Recordemos que este método va iterando por el carrito de reservas y va
llamando al método reservar() de CatalogoBean, que es el bean que implementa el
acceso a la base de datos.
1. Cambia el programa ReservasCliente para que la confirmación de las reservas se
haga dentro de una transacción:

...
UserTransaction utc = (UserTransaction)
jndiContext.lookup("javax.transaction.UserTransaction");
utc.begin();
System.out.println("Voy a confirmar la reserva");
reservas.realizaReserva();
System.out.println("Confirmas la transacción? (si,no): ");
BufferedReader in = new BufferedReader(new
InputStreamReader(System.in));
String line = in.readLine();
while(!line.equals("si") == !line.equals("no")){
System.out.println("Confirmas la transacción? (si,no): ");
in = new BufferedReader(new InputStreamReader(System.in));
line = in.readLine();
}
if (line.equals("si")) {System.out.println("Transacción confirmada");
utc.commit();
}
else {
utc.rollback();
System.out.println("Transacción anulada");
}
...
Prueba el programa y consulta en la base de datos si se han confirmado los cambios,
dependiendo de si la transacción se ha anulado o no. Cuando anulamos la transacción se
deshacen todos los cambios que se habían realizado en la base de datos.
2. Por último, vamos a modificar el descriptor de transacción del método

4
Copyright © 2005 Depto. CCIA All rights reserved.
Ejercicios - Transacciones y seguridad

realizaReserva para que la llamada a éste cree una nueva transacción con el atributo
RequiresNew. Al hacer esto, el método ya no está dentro de la transacción definida por el
cliente y la reserva se confirmará cuando termine la llamada al método, independientemente
de si desde el cliente anulamos o confirmamos la transacción.
Añade el siguiente código en el descriptor de despliegue ejb-jar.xml, dentro del
assembly-descriptor y después del method-permission
<container-transaction>
<method>
<ejb-name>ReservasBean</ejb-name>
<method-name>realizaReserva</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>
Salva la aplicación y despliégala. Vuelve a probar el ejemplo y comprueba que, una vez
realizada la llamada a realizarReserva los datos se han actualizado,
independientemente de la transacción definida en el cliente.

5
Copyright © 2005 Depto. CCIA All rights reserved.

También podría gustarte