computer_security_stock_image-100582931-orig

Segurança: não coloque o usuário logado no controller

É incrível como você aprende com a experiência. Saca só a jornada que tive para aprender a implementar segurança na web…

Quando comecei minha carreira como programador, lá por volta de 2005, e tive que implementar meu primeiro controle de acesso eu só sabia fazer isso de uma forma, e era jogando os dados do usuário logado diretamente na sessão:

public String logar(String login, String senha) {
    Usuario usuario = this.autentica(login, senha);
    if (usuario != null) {
        Session sessao = this.getSession();
        sessao.setAttribute("usuarioLogado", usuario); // coloca usuario na sessão
        return "/home.jsp";
    }
    return "/login.jsp";
}

Um dos problemas chatos dessa abordagem é que eu tinha que ficar testando se o usuário existia na sessão antes de fazer minhas lógicas de segurança – um saco! Era algo muito parecido com o código abaixo:

Usuario usuario = sessao.getAttribute("usuarioLogado");
if (usuario != null && usuario.getTipo() == ADMIN) {
    // logica de negocio...
}

Daí o tempo passou e depois aprendi outra forma mais esperta, que era deixando o usuário logado dentro do controller, no caso do JSF eu deixava dentro do managed bean:

@ManagedBean
@SessionScoped // managed bean na sessão
public class LoginBean {
    // outros atributos
    private Usuario usuarioLogado;

    public String logar() {
        // lógica para autenticar usuário e setar atributo usuarioLogado
    }
}

Resolveu? Ahhh… não!

Essa abordagem também trazia problemas sutis que eu levei alguns anos pra enxergar, apesar de sutis eles foram bem sérios e sobrecarregaram a memoria do servidor. Por esse motivo, para você não cometer os erros que eu cometi, eu bloguei sobre como representar o usuário logado no meu sistema mas desta vez tirando proveito da OO de verdade:

[Post] OO na prática: representando usuário logado no sistema

Após ler o post sobre essa prática você vai se perguntar porque diabos você não fez isso antes, afinal de contas, basta usar OO para modelar conceitos em objetos, que é algo que fazemos dia a dia para nossas entidades mas que ignoramos quando falamos de segurança.

E aí, como você tem feito pra guardar os dados do usuário logado?

Relatorios PDF com JasperReports

JasperReports: gere relatórios PDF na sua aplicação Web

Não sei você, mas eu sempre tive uma grande dificuldade com a API do JasperReports para gerar relatórios em PDF. Novo projeto significa reaprender a API. E acreditem, não tem como decorar um código que você praticamente escreve uma única vez e nunca mais olha.

Eu não gosto de simplesmente colar um código de um projeto em outro sem antes entender o que aquele código faz e como funciona. Por exemplo, para gerar relatórios nas minhas aplicações é comum ter um código semelhante a este:

// parametros
String jrxml = "/relatorios/todos-cursos.jrxml";
Map<String, Object> parametros = new HashMap<>();
Connection conexao = new ConnectionFactory().getConnection();

// gera relatorio pdf
GeradorDeRelatorios gerador = new GeradorDeRelatorios(conexao);
File pdf = gerador.geraPdf(jrxml, parametros);

// escreve na saida do response
Files.copy(pdf.toPath(), output);

O código é bem simples, não é? Isso porque toda a complexidade da API do JasperReports está encapsulada dentro da classe GeradorDeRelatorios. Todos os detalhes estão dentro dela e do seu método geraPdf. Dentro deste método existem 3 passos importantes para gerar relatórios em PDF, os relatórios que você desenhou com o iReport.

Para entender os 3 passos e o que realmente importa na API do JasperReports eu recomendo você ler meu novo post no blog da TriadWorks:

>> Como gerar relatórios PDF na Web com JasperReports

A verdade é que eu escrevi esse post para NUNCA mais esquecer como a API funciona e como posso tirar proveito dela. Ainda no post, eu aproveito para ensinar como disponibilizar seu PDF para download na sua aplicação Web.

E ai, como você implementou sua classe para gerar relatórios?

Introdução a Canvas do HTML5

De alguns anos para cá a tendência no desenvolvimento Web é gerar gráficos de relatórios diretamente no navegador do usuário e não mais no lado servidor. A vantagem é que todo o processamento fica no lado cliente e devido ao dinamismo do JavaScript é possível aplicar efeitos e animações… muito legal, não é?

Mas você já se perguntou que tecnologia é utilizada para desenhar esses gráficos via JavaScript? A resposta é Canvas do HTML5.

Com Canvas podemos desenhar gráficos, figuras geométricas, imagens, textos e animações diretamente no browser. Para você ter idéia do poder da tecnologia, com um pouco de JavaScript e Canvas nosso ex-estagiário criou em questão de minutos a logo da TriadWorks:

Logo da TriadWorks em Canvas do HTML5
Logo da TriadWorks em Canvas do HTML5

Não pára por aí… Se você conhecer um pouquinho de JavaScript e tiver uma boa lógica de programação você consegue criar um jogo sem muitas dificuldades! O melhor é que seu jogo rodará no navegador do seu desktop ou smartphone!

Para ajudá-lo a entender como o Canvas funciona e dar seus primeiros passos com a tecnologia nós postamos no blog uma introdução muito objetiva e didática do assunto:

>> HTML5: desenhando gráficos no browser com Canvas

No post de quebra ainda te damos algumas dicas sobre engines e framework para criação de jogos usando HTML5.

Como você já deve ter observado, a tendência do mercado é aproveitar melhor os recursos do HTML5 e dos navegadores a fim de criar interfaces de usuário mais ricas. O próprio JSF 2.2 investiu pesado na integração com HTML5!

Enfim, com Canvas + JavaScript você pode ir muito longe!