Criando seu próprio Codec de strings

Grails nos possibilita criar codecs dinâmicos de strings de uma maneira incrívelmente simples. Um dos principais usos para estes codecs consiste na encriptação/decriptação de strings, porém, como exporei, mais do que isto, estes codecs na realidade nos possibilitam enriquecer a classe java.lang.String.

O primeiro passo a ser adotado consiste em criar a classe que representa nosso codec. Tal como tudo no Grails, devemos nos ater às convenções definidas pela plataforma. O nome da classe deverá seguir a seguinte sintaxe: [Nome do codec]Codec.groovy, e deverá ser criada dentro do diretório grails-app/utils

Em nosso exemplo, irei recriar um codec retirado da documentação do próprio Grails, que pode ser visto logo abaixo:

import java.security.MessageDigest
import sun.misc.BASE64Encoder
import sun.misc.CharacterEncoder
class SenhaCodec {

	static encode = { str ->
		MessageDigest md = MessageDigest.getInstance('SHA')
		md.update(str.getBytes('UTF-8'))
		return (new BASE64Encoder()).encode(md.digest())
	}

}

Ao escrevermos um codec, novamente devemos adotar as convenções definidas pelo Grails. Segundo estas convenções, devemos implementar pelo menos um dos enclosures estáticos encode ou decode. Ambos recebendo um único parâmetro como valor (lógicamente, uma String).

Ao iniciarmos nossa aplicação, Grails irá incluir dinâmicamente na classe java.lang.String duas funções que retornam um valor do tipo String. São eles: encodeAs[nome do seu codec] e decodeAs[nome do seu codec]. Em nosso caso, serão criados dois métodos: encodeAsSenha e decodeAsSenha.

Em nosso exemplo, implementei apenas a closure encode, isto porquê trata-se de um codificador de senhas, e não é uma escolha inteligente armazenar senhas, mesmo que encriptadas em um banco de dados. Sendo assim, armazena-se apenas o hash das mesmas.

Se quisesse portanto utilizar este codec em qualquer parte da minha aplicação (detalhe, não preciso importar classe alguma, uma vez que todos os métodos do meu codec já foram incluídos na classe java.lang.String), poderia proceder tal como no exemplo abaixo:

class Usuario {
        String hashSenha
        String senha
        void setSenha(String valor)
        {
              this.senha = valor
              if (valor)
                  this.hashSenha = valor.encodeAsSenha()
        }

}

One thought on “Criando seu próprio Codec de strings

Leave a Reply

Your email address will not be published. Required fields are marked *