Capítulo 6 – Download do Spring Security

March 30th, 2014

Recentemente a página de downloads do Spring Security mudou, sendo que não existe mais a opção do download do pacote completo, contendo todos os JARs necessários para o funcionamento do Spring Security.

As únicas formas de conseguir todos os JARs indicados no livro é usando Maven ou obtendo cada arquivo jar diretamente do repositório Maven.

Como alternativa, temos o pacote de JARs necessários ao capítulo 6 na área de downloads do blog.

O link direto é

https://dl.dropboxusercontent.com/u/24365521/javaparaweb/downloads-javaparaweb-capitulo6.zip

Bons Estudos!

Reformulação da área de downloads do Blog

September 15th, 2012

Olá Pessoal,

Estamos reformulando a área de downloads do Blog, agora além dos projetos completos temos também para cada capítulo todos os downloads de bibliotecas e ferramentas que seria necessários no decorrer do livro. Isto inclui os tradicionais Jars e ferramentas como Apache Tomcat, Eclipse, MySQL, Hibernate, etc.

Assim você economiza tempo e tem facilmente todas as versões exatas que serão necessária durante o seu estudo.

Em muito breve teremos também arquivos com a evolução capítulo a capítulo do projeto FinanceiroWeb.

abraços

Décio Heinzelmann Luckow

Repositório SubVersion (SVN) privado e gratuito

June 19th, 2012

Olá a Todos,

Recentemente estive procurando por um repositório SVN para alguns dos meus projetos. O mais conhecido é o Source Forge, porém neste o serviço gratuíto é público também, ou seja, todos os fontes dos seus projetos podem ser consultados por qualquer um, isto porque o Source Forge só trabalha com projetos Open Source.

Porém as vezes você não quer tornar público alguns dos seus projetos, mas precisa de um local seguro e compartilhado para armazenar os seus fontes. Depois de algum tempo procurando, encontrei o RiouxSVN (http://riouxsvn.com).

Este disponibiliza até 4 respositórios de 50Mb, por conta, o que é o suficiente para a maioria dos projetos, se o desenvolvedor tomar o cuidado de utilizar o maven ou outra forma para não precisar armazenar os arquivos Jar no repositório.

Você tem a opção de expandir a capacidade da sua conta, fazendo “doações”, mas estas tem um custo bem atrativo.

Já estou utilizando e recomendo, a interface de administração do repositório é bem agradável e simples

Décio Heinzelmann Luckow

Spam no forum

March 21st, 2012

Recentemente o fórum do livro foi bombardeado com milhares de mensagens de spam. Como correção ativamos o cadastro de usuários com captcha e fizemos a limpeza das mensagens indevidas.

Porém estas ações não resolveram a questão, o spam voltou a aparecer.

Estamos tentando normalizar o funcionamento do forum, enquanto isso não ocorrer o atendimento aos leitores ficará prejudicado pela dificuldade de identificar as mensagens novas e reais, no meio de tanto lixo.

Se alguém tiver uma boa dica de técnicas anti-spam no fórum ficaremos muito gratos!

abraços

Artigo publicado na MundoJ de Março/Abril

April 19th, 2011

Um novo artigo do autor Décio Heinzelmann Luckow na Revista MundoJ (edição 46). Este artigo fala sobre a geração de compromissos no Java usando o padrão iCalendar.

A chamada do artigo é:

Geração de Compromissos com Java Usando o Padrão iCalendar
Aprenda a gerar compromissos via Java e enviá-los para programas como Google Calendar e Mozilla Sunbird.

Estes compromissos também são padrão para o Microsoft Outlook e a maioria dos aplicativos que fornecem recurso de calendário. O artigo apresenta o padrão, expõe inúmeras opções de configuração e ainda ensina como enviá-los por e-mail, gerar arquivo ou mantê-los como um serviço de calendário disponível na internet.

Não perca este exemplar!

abraços

Artigo publicado na revista MundoJ

January 13th, 2011

Este mês o autor Décio Heinzelmann Luckow teve um artigo publicado na Revista MundoJ (edição 45). Este artigo fala sobre recursos inovadores e incomuns do desenvolvimento web em Java usando JSF e JSTL.

A chamada do artigo é:

Além do JSF: Matriz de Campos com Recursos e Práticas Incomuns
Aprenda a construir uma tela  unindo JSF e JSTL permitindo o cruzamento de informações por meio de campos em matriz.

O artigo ensinará como criar formulários com campos em matriz usando JavaServer Faces e JSTL, utilizando recursos como eventos de campos, validação e conversão. São abordadas duas técnicas diferentes para envio dos dados, além de recursos interessantes e incomuns do JSF.

Além disso, os outros artigos da revista também trazem os assuntos mais requisitados do momento, como HTML5, Java com TV Digital,  Hibernate, Concursos Públicos, SOA e Google Web ToolKit. Configura neste endereço a descrição completa dos artigos: http://www.mundoj.com.br/conteudo.shtml.

Não perca este exemplar!

abraços

Destaque na Revista WWW.com.br

December 17th, 2010

A revista WWW.com.br deste mês (Editora Europa) divulgou o livro Programação Java para a Web na sua coluna Livros & DVDs (página 17). Esta coluna – que traz como slogan “O que não pode faltar na sua biblioteca de referência” – mostra a capa do livro e um pequeno texto descrevendo seu conteúdo. Além do livro Programação Java para a Web, ela divulga nesta coluna ainda o DVD HTML5 New (vídeo aula) e o livro Expert PHP 5 Tools.

Esta edição traz matérias muito interessantes, onde podemos dar destaque para:

  • Descubra o futuro dos padrões web – envolvendo CSS3 e HTML5 e avanços em tipografia e navegadores.
  • JavaScript fácil e rápidoAnalisamos as melhores bibliotecas para você usar agora mesmo.

Entre os tutoriais, muito coisa legal para se fazer usando CSS, JQuery e Flash. Além disso um tutorial que considero de grande importância: Planejamento/Pense no seu conteúdo – Identifique fatores que podem ajudar ou atrapalhar sua estratégia de conteúdo.

Vale a pena adquirir, procure na sua banca mais próxima!

abraços

Disponibilidade de arquivos do JavaServer Faces

December 16th, 2010

Atualizado: O site do JavaServer Faces já está normalizado, já é possível fazer o download dos pacotes clicando na página principal.

Recentemente o Java.net lançou uma nova plataforma de apoio aos seus projetos, chamada Kenai. Gradualmente os projetos estão sendo migrados. Infelizmente muito leitores estão tendo dificuldade de baixar os arquivos do JSF neste período de migração, isto porque os arquivos não estão mais aparecendo na página de downloads do projeto.

Enquanto a migração não é concluída, utilize o seguinte link para baixar os arquivos do JavaServer Faces

http://javaserverfaces.java.net/downloads/ri/

Lembrando que o livro trabalha com a versão 2.0 do JavaServer Faces, desta forma, baixe o arquivo 2.0.x disponível.

Assim que esta nova plataforma se estabilizar, lançaremos um novo post explicando a sua utilização.

Independente da disponibilidade do JSF, todos as bibliotecas e arquivos .jar necessários estão disponíveis para download na seção DOWNLOADS deste blog, os pacotes [completo] possuem todos os arquivos necessários, já os pacotes [fontes] possuem apenas os arquivo .xml e .java.

Livro Programação Java Para a Web na semana do livro do SENAI/SC

December 13th, 2010

No início de Novembro o livro Programação Java Para a Web, foi lançado junto e divulgado durante  a semana do livro do SENAI/SC em Joinville. No evento o co-autor do livro Décio Luckow ministrou uma palestra, falando das oportunidades para web com Java.

Após a palestra que contou com vários participantes, realizou-se uma confraternização na biblioteca da instituição onde os visitantes puderam apreciar a obra in loco.

Algumas fotos do evento:

Usando criptografia no cadastro de usuários

November 13th, 2010

O aplicativo desenvolvido no livro trabalha inteiramente com a senha do usuário aberta. Porém no tópico 6.8.2 damos uma dica de como configurar o Spring Security para trabalhar com a senha criptografada em MD5. O problema é que esta configuração não é suficiente para que o sistema inteiro trabalhe com a senha criptografada. Foi ai que o leitor Rafael Freitas entrou em contato e solicitou que fizessemos um post explicando como fazer esta alteração, o que faz todo o sentido.

Primeiro uma definição importante: a conhecido algoritmo Base64 na verdade é uma codificação e não criptografia, pois ele é reversível.  Para ser considerada uma criptografia o algoritmo tem que ser inversível, o algoritmo MD5 tem esta capacidade.

De maneira macro, para que o sistema trabalhe com a senha do usuário criptografada algumas alterações são necessárias:

  1. Configuração do framework de segurança para trabalhar com a senha criptografada (já realizado no tópico 6.8.2).
  2. Decidir onde realizar a encriptação da senha do usuário
  3. Encriptar a senha do usuário
  4. Não exibir a senha criptografada em tela ao editar um usuário

Veremos agora o entendimento de cada alteração e depois a alteração passo a passo.

2 Decidir onde realizar a encriptação da senha do usuário

Seguindo o método utilizado no livro de sempre analisar e argumentar bem em qual camada uma alteração deve ser feita, vamos pensar sobre a alteração da senha criptografada.

A camada de acesso a dados (UsuarioDAO) deve ser imediatamente descartada, pois como já foi explicado esta camada apenas transfere dados do sistema para o banco de dados, não deve fazer qualquer alteração ou transformação.

A camada de regra de negócio (UsuarioRN) é uma forte candidata, mas como a senha do usuário será criptografada e esta criptografia é irreversível significa que a senha do usuário entrará nela aberta  (ao salvar) e sairá criptografada (ao consultar). Acredito que isto pode causar alguma confusão. O ideal é que esta camada sempre trabalhe com a senha em um formato único.

Desta forma, a camada de visualização é o local correto para fazer a alteração e controlar a criptografia. Ela obrigatoriamente irá trabalhar com a senha aberta, pois é o que o usuário digita na tela, mas assim que receber esta senha deverá encriptar e enviar adiante para salvar, o que garante uma maior segurança.

3 Encriptar a senha do usuário

A encriptação da senha do usuário pode ser feita com uma classe do próprio Spring Security, conforme o exemplo a seguir:

import org.springframework.util.DigestUtils;

String senhaAberta = “teste123″;
String senhaCripto;
senhaCripto = DigestUtils.md5DigestAsHex(senhaAberta.getBytes());
System.out.println(senhaCripto);

Resultado

aa1bf4646de67fd9086cf6c79007026c

4 Não exibir a senha criptografada em tela ao editar um usuário

A partir do momento que o sistema começar a trabalhar com a senha criptografada não vai mais fazer sentido enviar esta senha para a tela, para alteração, como já é atualmente.

Não faz sentido pois pode causa confusão por dois motivos:

  • A senha em MD5 é bem maior que a senha real digitada. Se o usuário digitar uma senha de 5 caracteres, em MD5 ela terá 32 caracteres. Se ao alterar um registro o usuário perceber esta senha bem maior vai estranhar e vai achar que está errado.
  • Enviar a senha criptografada para a tela fará com que o campo de senha as vezes tenha uma senha aberta e outras vezes uma senha criptografada, com certeza é confuso.

Ou seja, se for o cadastro de um novo usuário a senha será preenchida normalmente, ser for uma alteração de usuário o campo senha deverá ser mantido em branco e o usuário somente preencherá este campo de quiser alterar a senha, senão deixa em branco.

Com isso definimos um comportamento do sistema: o campo de senha só será preenchido com senha aberta.

Porém se a senha for deixada em branco (significando que o usuário quer manter a senha antiga), como vamos salvar o registro do usuário se esta senha está em branco?

O segredo aqui é guardar a senha criptografada do usuário em outro local, quando a tela for aberta para edição (veremos como fazer no passo a passo).

Para manter o campo da senha em branco e considerar que ele só será preenchido quando o usuário quiser alterar existem duas opções:

1. Colocar um aviso junto ao campo dizendo: Preencher somente se quiser alterar.

2. Usar o componente do Primefaces WaterMark, que mostrará a mesma mensagem anterior, só que dentro do campo. http://www.primefaces.org/showcase/ui/watermark.jsf

Fazendo a alteração passo a passo

1. Crie uma nova propriedade String senhaCriptografada na classe UsuarioBean, gerando os métodos get e set.

2. Altere os campos de senha de tela para não serem obrigatórios caso seja uma edição de usuário. É possível identificar isto alterando o atributo  required dos campo Senha e Confirmar Senha para:
required=”#{empty contextoBean.usuarioLogado}”

3. Altere os campos de senha da tela para não re-exibirem a senha, configurando o atributo redisplay=”false”.

4. Altere o método editar() para armazenar a senha atual na propriedade senhaCriptograda.

5. Altere o método salvar() para recuperar a senhaCriptografada (senha = senhaCriptografada) caso esta não senha sido preenchida em tela, e para criptografar a senha caso tenha sido preenchida em tela.

6. Inclua na tela usuario.xhtml um campo inputHidden armazenando a senhaCriptografada:
<h:inputHidden value=”#{usuarioBean.senhaCriptografada}”/>
A classe UsuarioBean (métodos editar e salvar) ficará conforme o exemplo a seguir:

public String editar() {
    this.senhaCriptografada = this.usuario.getSenha();
    return "/publico/usuario";
}

public String salvar() {
	FacesContext context = FacesContext.getCurrentInstance();

	String senha = this.usuario.getSenha();
	if (senha != null &&
            senha.trim().length() > 0  &&
            !senha.equals(this.confirmarSenha)) {
		FacesMessage facesMessage = new FacesMessage("A senha não foi confirmada corretamente");
		context.addMessage(null, facesMessage);
		return null;
	}
	
	if (senha != null && senha.trim().length() == 0) {
		this.usuario.setSenha(this.senhaCriptografada);
	} else {
		String senhaCripto = DigestUtils.md5DigestAsHex(senha.getBytes());
		this.usuario.setSenha(senhaCripto);
	}

	UsuarioRN usuarioRN = new UsuarioRN();
	usuarioRN.salvar(this.usuario);
	[...]
}