Ir al contenido principal

Pruebas de Integración con seguridad en Grails

Pues no existe mucha documentación en cuanto a las pruebas de integración con el nuevo plugin de Burt Beckwith, así que aquí les voy a poner lo que necesitan, use una clase base para las pruebas de integración aunque, si lo desean, pueden poner ese código en cada prueba que necesite la seguridad

BaseTest.groovy
package general

import groovy.util.GroovyTestCase
import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.authority.GrantedAuthorityImpl
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser
import org.springframework.security.core.context.SecurityContextHolder as SCH
import org.springframework.security.authentication.TestingAuthenticationToken

abstract class BaseTest extends GroovyTestCase {

def authenticateAdmin() {
def user = general.Usuario.get(1)
def authorities = [new GrantedAuthorityImpl('ROLE_ADMIN'),new GrantedAuthorityImpl('ROLE_USER')]
def credentials = 'test'
def principal = new GrailsUser(user.username,credentials,true,true,true,true,authorities,user.id)
authenticate(principal,credentials,authorities)
}

def authenticate(principal, credentials, authorities) {
def authentication = new TestingAuthenticationToken(principal, credentials, authorities as GrantedAuthority[])
authentication.authenticated = true
SCH.context.authentication = authentication
return authentication
}

}


UsuarioServiceIntegrationTests.groovy
package general

import groovy.util.GroovyTestCase;
import org.junit.Before
import org.junit.Test

class UsuarioServiceIntegrationTests extends BaseTest {
def springSecurityService
def usuarioId
def usuarioService

@Before
public void setUp() {
def usuario = new Usuario(
username:'test10'
,password:springSecurityService.encodePassword('test')
,enabled:true
,nombre:'Test1'
,apellido:'User'
,correo:'test1@test.com'
).save()
def rol = Rol.findByAuthority('ROLE_ADMIN')
UsuarioRol.create(usuario,rol,true)
usuarioId = usuario.id
assert usuarioId
}

@Test
void testLista() {
def lista = usuarioService.lista(null)
assert lista
assertTrue lista.size() >= 1
}

@Test
void testObtiene() {
def usuario = usuarioService.obtiene("$usuarioId")
assert usuario
assertEquals 'test10', usuario.username
}

@Test
void testNuevo() {
authenticateAdmin()
def usuario = new Usuario(
username:'test11'
,password:springSecurityService.encodePassword('test')
,enabled:true
,nombre:'Test1'
,apellido:'User'
,correo:'test1@test.com'
)
usuario = usuarioService.crea(usuario, [])
assert usuario
assert usuario.id
}

@Test
void testActualiza() {
authenticateAdmin()
def usuario = usuarioService.obtiene("$usuarioId")
assert usuario
assertEquals 'test10', usuario.username

usuario.username = 'PRUEBA'
usuario = usuarioService.actualiza(usuario, [])
assert usuario
assertEquals 'PRUEBA',usuario.username
}

@Test
void testElimina() {
authenticateAdmin()
def nombre = usuarioService.elimina("$usuarioId")
assert nombre
assertEquals 'test10',nombre
}
}


UsuarioService
package general

import java.util.List
import auditoria.general.XUsuario

class UsuarioService {

static transactional = true
def springSecurityService

List lista(def params) {
log.debug "Lista de usuarios"
return Usuario.list(params)
}

def listaConCantidad(def params) {
def usuarios = this.lista(params)
def cantidad = Usuario.count()
return [lista:usuarios, cantidad:cantidad]
}

Usuario obtiene(String id) {
return Usuario.get(id)
}

Usuario crea(Usuario usuario, List roles) {
usuario.save()
for(rol in roles) {
general.UsuarioRol.create(usuario, rol, false)
}
audita(usuario,Constantes.CREAR)
return usuario
}

Usuario actualiza(Usuario usuario, List roles) {
log.debug "Actualizando al usuario $usuario, $roles"
usuario.save()
general.UsuarioRol.removeAll(usuario)
for(rol in roles) {
general.UsuarioRol.create(usuario, rol, false)
}
audita(usuario,Constantes.ACTUALIZAR)
return usuario
}

String elimina(String id) {
def usuario = Usuario.get(id)
String nombre = usuario.username
UsuarioRol.removeAll(usuario)
usuario.delete()
audita(usuario,Constantes.ELIMINAR)
return nombre
}

void audita(Usuario usuario, String actividad) {
log.debug "[AUDITA] $actividad $usuario"
def creador = springSecurityService.authentication.name
//def xusuario = new XUsuario(usuario.properties)
def xusuario = new XUsuario(usuario.properties)
StringBuilder roles = new StringBuilder()
for(rol in usuario.authorities) {
roles.append(rol.authority)
roles.append("|")
}
xusuario.roles = roles.toString()
xusuario.usuarioId = usuario.id
xusuario.creador = creador
xusuario.actividad = actividad
xusuario.save()
}
}

Comentarios

Entradas más populares de este blog

OpenSolaris, Clúster de Glassfish y Sun Java Web Server Loadbalancer

Pues estuve necesitando un clúster de Glassfish V2U2 para lo cual encontré rápidamente mucha información en Internet, el que más me gustó fue un blog de Ryan Wilson , pero también necesitaba poner el balanceador de cargas ( loadbalancer ) asi que para eso utilicé la documentación de Glassfish . Aquí el resúmen: Instalar OpenSolaris 200805 y despues realizar lo que les sugieren en los Release Notes , en donde te dicen que actualices su herramienta para instalar paquetes. NOTA: Antes de hacer esto, asegurarse de tener todas las máquinas que van a participar dentro del cluster mapeadas con un DNS, de no ser esto posible sus archivos de hosts deben de tener la información suya y de cada una de las máquinas que van a participar. (Gracias a equipo Telcel) Despues de esto seguir las instrucciones de Ryan . Con esto vas a tener el cluster de glassfish funcionando. Solo que en la configuración del segundo servidor puedes hacer lo siguiente para evitar los pasos 4 al 6 (lo siguiente todo en una...

Reporte Excel con JasperReports

Pues no funcionó el reporte con Jasper, pude hacer que evitara paginar con estas opciones ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); JRXlsExporter exporterXLS = new JRXlsExporter(); exporterXLS.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint); // exporterXLS.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); exporterXLS.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); exporterXLS.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE); exporterXLS.setParameter(JRXlsExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE); exporterXLS.setParameter(JRXlsExporterParameter.IGNORE_PAGE_MARGINS, Boolean.TRUE); exporterXLS.s...

JQuery Image Upload en Spring MVC

Utilizar el jQuery File Upload de blueimp  en Grails es una delicia. Pero necesito hacer una aplicación grande y no sé lo suficiente como para mantenerla óptima dentro de Grails, así que decidí portarla a Spring MVC, pero no encontré una implementación de esta herramienta en Java que hiciera lo que hace el plugin, que simplemente implementa lo que la herramienta ya hace en otras plataformas. Así que me puse a implementarla y ya quedó. La pueden encontrar en github ... Sólo necesitan clonarla, y ejecutarla con maven: mvn tomcat7:run