Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

Para realizar la impersonación en aplicaciones que no la tienen, seguiremos los siguientes pasos:


  • Descargamos el fichero suplantacion_arqetipo_v2.0.19.zip en la raíz del proyecto, y los descomprimimos con Extraer aquí.
  • Hay que revisar la página suplantarUsuario.xhtml, probablemente, tenga algún problema visual, ya que esta basado en el tema corporativo.
  • Hay que revisar el fichero suplantarUsuario.page.xml, para establecer en el <restrict>, la expresión EL válida, que permite a los usuarios con permisos/roles válidos, acceder a ella.

Otro elemento a tener en cuenta en la impersonación, son los datos del usuario que va a suplantar, que hay almacenados en el Identity / UmuIdentity. Tenemos disponible en la clase UmuIdentity, los métodos:

  • protected void backupProperties( Map<String, Object> identityProperties )
  • protected void restoreProperties( Map<String, Object> identityProperties )

que permiten guardar y restaurar esos datos, como por ejemplo el UUID del usuario. En la llamada al método supplantUser() se llamará el método backupProperties(), y en la llamada al método restoreSupplanterUser() se llamará el método restoreProperties().

La suplantación de identidad es el proceso por el que un usuario perteneciente a una aplicación, asume el papel de otro usuario (también perteneciente a la aplicación). Tras este proceso, las acciones que realice el suplantador y opciones que visualice, serán las que estén disponibles para el suplantado. Quedando registrado el suplantado como el usuario que las realiza en el log.

Para hacer una suplantación de identidad en Fundeweb 2.0, bastará con llamar al método emulateLoginSeam situado en la clase UmuIdentity, pasándole como parámetro el usuario que se quiere suplantar.

Bloque de código
languagejava
themeEclipse
	/**
	 * Emula un Login en SEAM ya que estamos Loggeados en el CAS
	 * @param user usuario que queremos suplantar
	 */
	public void emulateLoginSeam(String user) {
		preAuthenticate();
 
		this.clean(true);
		// Metemos el principal en el identiy la unica manera es esta (simula un login de Seam)
		this.acceptExternallyAuthenticatedPrincipal(new SimplePrincipal(user));
 
		// El credential sin SESSION directo
		getCredentials().setUsername(user);
 
		postAuthenticate();
 
		if (Events.exists()) {
			Events.instance().raiseEvent(EVENT_LOGIN_SUCCESSFUL);
		}
	}

Tras esta llamada, se llamará inmediatamente, en el UmuIdentityLoader, a toda la carga de datos asociados a ese usuario (al estar anotada por el método @Observer(“org.jboss.seam.security.loginSuccessful”)

...


Estos métodos para backup/restore, se pueden sobrescribir para añadir las propiedades a salvar/restaurar, después de la suplantación. Solo son necesarias salvar/restaurar, las propiedades que no se cargan cuando se llama al método UmuIDentityLoader.loadDataLoginSuccessful(), que se ejecuta automáticamente al lanzar la aplicación el evento Identity.EVENT_LOGIN_SUCCESSFUL. Si se sobrescriben los métodos de backup/restore, siempre deben incluir una llamada al método del padre, ejemplo:



Bloque de código
languagejava
themeEclipse
@Override
protected void backupProperties( Map<String, Object> @InidentityProperties UmuIdentity identity;
 ) {
	public void suplantarIdentidad(){
                ....
                //Métodos previos a la emulación
                ....
		identity.emulateLoginSeam(user);
	super.backupProperties( identityProperties );

	// salvar propiedades especificas de mi aplicacion
    identityProperties.put( "miPropiedad", miPropiedad );
	...
}


@Override
protected void restoreProperties( Map<String, Object> identityProperties ) {
	super.restoreProperties( identityProperties );

	// restaurar propiedades especificas de mi aplicacion
    miPropiedad = identityProperties.get( "miPropiedad" );
	...
}