martes, 25 de junio de 2013

Instalar y configurar Spring Security en Grails parte 1


En este tutorial aprenderemos a instalar y configurar el plugin de Spring Security para Grails y poder usarlo de manera adecuada en nuestros proyectos, agradeciendo la colaboración de Miguel Coba por las dudas resueltas :D


Instalando el plugin de Spring Security

Para realizar la instalación del plugin (asumimos que ya tenemos un proyecto grails) simplemente necesitamos ejecutar el siguiente comando desde nuestro IDE favorito o bien desde la línea de comandos con Grails.



Configurando el plugin de Spring Security

Para realizar la configuración de como spring security define las reglas de accesos existen varias formas de realizarlo, en este tutorial veremos la configuración por Requestmap almacenados en la base de datos (las otras opciones son: por anotaciones y por un mapa definido en Config.groovy http://grails-plugins.github.io/grails-spring-security-core/docs/manual/lo primero que debemos realizar es la creación de algunos dominios que son requeridos por el plugin estos son: Usuario, Rol, Requestmap y UsuarioRol.

Usuario:
 

class Usuario {

    transient springSecurityService


    String username
    String password
    boolean enabled
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired
    String nombre
    String apellidoPaterno
    String apellidoMaterno
    String email
    Date fechaAlta

    static constraints = {
        username(blank: false, unique: true)
        password(blank: false)

        nombre(blank: false, size: 2..100)
        apellidoPaterno(blank: false, size: 2..50)
        apellidoMaterno(blank: false, size: 2..50)
        email(email: true, blank: false)
        fechaAlta()
    }

    static mapping = {
        password column: '`password`'
    }

    Set getAuthorities() {
        UsuarioRol.findAllByUsuario(this).collect { it.rol } as Set
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
         encodePassword()
     }
    }

    protected void encodePassword() {
        password = springSecurityService?.encodePassword(password)
    }

}

Rol:
class Rol {

    String authority

    static mapping = {
        cache true
    }

    static constraints = {
        authority blank: false, unique: true
    }
} 

UsuarioRol:
 

import org.apache.commons.lang.builder.HashCodeBuilder

class UsuarioRol implements Serializable {

 Usuario usuario
 Rol rol

 boolean equals(other) {
  if (!(other instanceof UsuarioRol)) {
   return false
  }

  other.usuario?.id == usuario?.id &&
   other.rol?.id == rol?.id
 }

 int hashCode() {
  def builder = new HashCodeBuilder()
  if (usuario) builder.append(usuario.id)
  if (rol) builder.append(rol.id)
  builder.toHashCode()
 }

 static UsuarioRol get(long usuarioId, long rolId) {
  find 'from UsuarioRol where usuario.id=:usuarioId and rol.id=:rolId',
   [usuarioId: usuarioId, rolId: rolId]
 }

 static UsuarioRol create(Usuario usuario, Rol rol, boolean flush = false) {
  new UsuarioRol(usuario: usuario, rol: rol).save(flush: flush, insert: true)
 }

 static boolean remove(Usuario usuario, Rol rol, boolean flush = false) {
  UsuarioRol instance = UsuarioRol.findByUsuarioAndRol(usuario, rol)
  if (!instance) {
   return false
  }

  instance.delete(flush: flush)
  true
 }

 static void removeAll(Usuario usuario) {
  if(usuario.id) 
   executeUpdate 'DELETE FROM UsuarioRol WHERE usuario=:usuario', [usuario: usuario]
 }

 static void removeAll(Rol rol) {
  executeUpdate 'DELETE FROM UsuarioRol WHERE rol=:rol', [rol: rol]
 }

 static mapping = {
  id composite: ['rol', 'usuario']
  version false
 }
}


RequestMap:
 


class Requestmap {

 String url
 String configAttribute

 static mapping = {
  cache true
 }

 static constraints = {
  url blank: false, unique: true
  configAttribute blank: false
 }
}

Lo siguiente que tenemos que hacer es realizar algunas configuraciones en Config.groovy primero que nada indicándole el algoritmo que utilizara spring security para la encriptación de los passwords para ello basta con indicar la siguiente línea donde le indicamos que use MD5:

 
grails.plugins.springsecurity.password.algorithm='MD5'
 
No pensé que se hiciera demasiado grande el tutorial por lo cual dejamos hasta aquí la primera parte continuando con la inserción de los querys requeridos y las pantallas de login en la siguiente parte, espero les sea de ayuda.

2 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. Que tal, generalmente ese error sale cuando el contenido a almacenar es más grande que lo que puede almacenar el campo de tu base de datos.

      Eliminar