Ejercicios sesión 8

En este ejercicio vamos a modificar el EJB savingsaccount para incorporar un control de acceso. En resumen, vamos a definir dos roles, Administrador y ReadOnly y vamos a probar la aplicación cliente

Descargar y probar el ejb savingsaccount

Lanza el servidor de ejemplos creado en un ejercicio anterior. Comprueba si se encuentra desplegado el EJB savingsaccount-ejb.jar. En el caso en que se encontrara, bórralo. Descarga el fichero ejemplo8.zip y descomprímelo en el directorio de trabajo. Vamos a trabajar con ese EJB. Debes desplegarlo y probar la aplicación cliente que se encuentra en el directorio src. Para ello hay que crear la tabla en la base de datos (el script se encuentra en el directorio sql), desplegar el bean, compilar la aplicación cliente y probarla.

Recordamos la forma de ejecutar el script savingsaccount.sql:

  % cd sql
  % $WL_HOME/weblogic700/samples/server/eval/pointbase/tools/startPointBaseCommander.sh
  Do you wish to create a "New/Overwrite" Database? [default: N]: 
  Select product to connect with: Embedded (E), or Server (S)? [default: E]: S
  Please enter the driver to use: 
    [default: [com.pointbase.jdbc.jdbcUniversalDriver]: 
  Please enter the database URL to use: 
    [default: [jdbc:pointbase:server://localhost/sample]: 
	  jdbc:pointbase:server://localhost/demo
	Username: [default: PBPUBLIC]: examples
	Password: [default: PBPUBLIC]: examples
	PointBase Commander 4.2ECF build 183 SERVER
	Interactive SQL command language. Mac OS X/10.1.5(C) Copyright 1998 - 2002 PointBase(R), 
	Inc. All rights reserved
	SQL> run "savingsaccount.sql";

Crear de nuevos usuarios en el servidor weblogic

1. Abre la consola de administración. Pincha la opción Realms y después pincha en myreal. Aparecerá una pantalla de entrada de datos. Selecciona la pestaña superior Contents y, en la nueva pantalla que aparece, pincha el elnlace Manage Users within this Realm. En la nueva pantalla, pincha en Configure a new user.... Allí tendrás que definir el nombre y contraseña del nuevo usuario. Pon admin como usuario y weblogic como contraseña. Si escoges otra contraseña, debe tener 8 o más caracteres. Pulsa Apply.

2. Pincha en la pestaña Groups, selecciona el grupo Administrators y pulsa la flecha. De esta forma añadimos el usuario admin al grupo Administrators.

3. Crea ahora el usuario operador. Asígnalo al grupo Operators.

Modificación del bean savingsaccount

1. Desempaqueta el EJB JAR

% jar xvf savingsaccount-ejb.jar

2. Modifica el fichero META-INF/ejb-jar.xml para incorporar el control de acceso al EJB. Para ello borra las siguientes líneas

    <method-permission>
      <unchecked />
      <method>
        <ejb-name>SavingsAccountEJB</ejb-name>
        <method-name>*</method-name>
      </method>
    </method-permission>

y sustitúyelas por estas otras

    <security-role>
      <role-name>Administrador</role-name>
    </security-role>
    <security-role>
      <role-name>ReadOnly</role-name>
    </security-role>

    <method-permission>
      <role-name>Administrador</role-name>
      <method>
        <ejb-name>SavingsAccountEJB</ejb-name>
        <method-name>*</method-name>
      </method>
    </method-permission>

    <method-permission>
      <role-name>ReadOnly</role-name>
      <method>
        <ejb-name>SavingsAccountEJB</ejb-name>
        <method-name>getFirstName</method-name>
      </method>
      <method>
        <ejb-name>SavingsAccountEJB</ejb-name>
        <method-name>getLastName</method-name>
      </method>
      <method>
        <ejb-name>SavingsAccountEJB</ejb-name>
        <method-name>findByPrimaryKey</method-name>
      </method>
      <method>
        <ejb-name>SavingsAccountEJB</ejb-name>
        <method-name>getBalance</method-name>
      </method>
      <method>
        <ejb-name>SavingsAccountEJB</ejb-name>
        <method-name>findByLastName</method-name>
      </method>
      <method>
        <ejb-name>SavingsAccountEJB</ejb-name>
        <method-name>findInRange</method-name>
      </method>
    </method-permission>

3. Por último, debes hacer corresponder los roles con los usuarios antes creados. Para ello debes añadir las siguientes líneas al final del fichero META-INF/weblogic-ejb-jar.xml, justo antes del elemento </weblogic-ejb-jar>

  <security-role-assignment>
    <role-name>Administrador</role-name>
    <principal-name>admin</principal-name>
  </security-role-assignment>
  <security-role-assignment>
    <role-name>ReadOnly</role-name>
    <principal-name>operador</principal-name>
  </security-role-assignment>
  

4. Construye de nuevo el bean

% jar cvf savingsaccount-ejb.jar *.class META-INF/*

y vuelve a desplegarlo usando la consola del servidor de aplicaciones.

5. Una vez desplegado el bean, prueba la aplicación cliente. Deberá arrojar un error producido porque no se tiene suficientes privilegios para trabajar con el bean.

Intentando encontrar la cuenta con identificador: i0
  Caught an exception.
  java.rmi.AccessException: Security Violation: User: '<anonymous>' has 
  insufficient permission to access EJB: type=<ejb>, application=savingsaccount-ejb, 
  module=savingsaccount-ejb, ejb=SavingsAccountEJB, method=findByPrimaryKey, 
  methodInterface=Home, signature={java.lang.String}.

6. Para autentificarte, introduce el siguiente código en la aplicación cliente:

   public static Context getInitialContext()
        throws javax.naming.NamingException {
           Properties p = new Properties();
           p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
           p.put(Context.SECURITY_PRINCIPAL, "admin");
           p.put(Context.SECURITY_CREDENTIALS, "weblogic");
           p.put(Context.PROVIDER_URL, "t3://localhost:7001");
           return new javax.naming.InitialContext(p);
    }
  }

7. Prueba a autientificarte como usuario operador. Verás que se obtiene el siguiente error en el control de acceso.

Intentando encontrar la cuenta con identificador: i0
...
Intentando encontrar la cuenta con identificador: i16
Intentando encontrar la cuenta con identificador: i17
Intentando encontrar la cuenta con identificador: i18
Intentando encontrar la cuenta con identificador: i19
Caught an exception.
java.rmi.AccessException: Security Violation: User: 'operador' 
has insufficient permission to access EJB: type=, 
application=savingsaccount-ejb, module=savingsaccount-ejb, 
ejb=SavingsAccountEJB, method=getId, methodInterface=Remote, signature={}

8. Modifica por último el descriptor de despliegue para que el rol ReadOnly pueda acceder al método getId. Despliega otra vez el bean y vuelve a probar la aplicación cliente. Comprueba qué sucede.