Autenticação e Autorização

Postado em Atualizado em

as-pagina-3Aplicativos web são formados por diversos recursos, como páginas dinâmicas, estáticas, imagens, downloads, uploads, processos, relatórios etc. E na maioria delas existe a necessidade de controlar o acesso dos usuários a estes recursos, restringindo-o somente para aqueles previamente identificados e autenticados. Autenticação representa a forma de como o usuário prova quem realmente ele é e a Autorização é utilizada para verificar se o determinado usuário previamente autenticado possui permissão para usar, manipular ou executar o recurso em questão. E a grande questão aparece no momento decisivo do projeto:

Como implementar autenticação e autorização em aplicativos java ?

O objetivo deste post é levantar a algumas das possibilidades de implementação da autenticação e autorização que podem ser feitas em aplicativos web construídos em java e comentar sobre suas características e particularidades.
Segue abaixo as opção levantadas, seus comentários e alguns links apresentando possibilidades, documentações e tutoriais de possíveis implementações:

1. Servlet Filter

A forma mais básica, caseira e rápida de implementar controle de usuários seria a através da construção e configuração manual de servlet filters. Existentes desde a versão 2.3 da especificação, os filters possibilitam a interceptação, manipulação e redirecionamento do pedido HTTP antes que ele chegue ao seu destino real. Com base em sua funcionalidade, seria muito simples construir um filtro especifico para o determinado contexto da aplicação fazendo o controle de acesso aos recursos da aplicação. E para aqueles que prezam a simplicidade mas com flexibilidade, também podem usar o filter para implementar mecanismos mais elaborados e flexíveis, combinando os filtes com arquivos xml, deixando a implementação completamente softcode. Segue abaixo alguns links apresentando explicações básicas e algumas sugestões de como usar.

2. Phase Listener

Para as aplicações escritas em JavaServer Faces, além da opção de usar servlets filters, estas podem se utilizar de um recurso especifico do JSF chamado da phase listener que é responsável por interceptar e oferecer mecanismos de manipulações referentes as mudanças de eventos ocorridas no ciclo de vida da especificação. Relacionado ao contexto de autenticação e autorização, ela se encaixa perfeitamente para a implementações de controle de usuários, oferendo ao projetista da aplicação mais uma opção arquitetural. Segue abaixo links sobre opções de implementações:

3. Container Managed Security

Define um modelo padrão JEE de regras de como a aplicação web pode definir e gerenciar controle de acesso. Baseado em especificação e implementado por todos containers compatíveis, o JAAS é a solução 100% portável indicada pela especificação para ser usada. Nele, existem diferentes níveis em opções de autenticação que são baseado na definição ROLES que são resumidamente grupos de usuários. O base de dados dos usuários credenciados podem estar em arquivos xml, bancos de dados relacionais, ldaps etc. Segue abaixo alguns links sobre utilização dele:

4. jGuard

Framework proprietário construído em cima do JAAS oferecendo alguns automatismos, facilidades e integrações interessantes com alguns componentes JEE sendo um boa opção a ser considerada. Segue abaixo o link para o site oficial que contém todas as informações:

5. Spring Security

Framework proprietário que oferece uma variedade incrível de opções arquiteturais e features de complemento. Muito poderoso, flexível, fácil e amplamente utilizado pela comunidade Java. Segue abaixo o link para o site oficial que contém todas as informações e o livro de referência:

6. Apache Shiro

Framework proprietário que oferece uma variedade incrível de opções arquiteturais e features de complemento. Segue abaixo o link para o site oficial que contém todas as informações:

Conclusão

Objetivo do post não é apontar a “melhor” ou “ideal” para uma solução, mas sim apresentar algumas das possibilidades das mais simples, as mais sofisticadas ficando assim, a cargo dos projetistas responsáveis julgar e selecionar aquela que lhe melhor encaixe no seu determinado escopo/projeto em especifico.

“Sê forte e corajoso; não temas, nem te espantes, porque o SENHOR, teu Deus, é contigo por onde quer que andares.”  Josué 1:9

6 comentários em “Autenticação e Autorização

    Vinícius Araújo disse:
    31/05/2010 às 15:32

    O jGuard é open-source.

      Fernando Franzini disse:
      31/05/2010 às 16:05

      Como já citada no post referenciado…é um opção tb.

    mateus disse:
    12/03/2011 às 15:20

    o JBoss Seam tbm tem uma implementação muito boa.

    Fernando Franzini respondido:
    21/07/2011 às 11:19

    Então galera, usar autenticação baseada em filter no JSF 2 tem um bug de segurança por causa do ciclo de vida do XHTML. Resolvemos o assunto aqui – http://www.guj.com.br/java/247653-nova-versao-do-jsf-2-nao-dispara-o-forward-na-navegacao-das-paginas-xhtml-resolvido

    Ricardo disse:
    25/06/2014 às 13:47

    Olá qual estratégia de autorização que vocês usam nos casos onde a apenas as definições de regras e grupos não é suficiente? por exemplo um hospital que disponibilize os resultados de exames online, após logar o usuário josé é redirecionado para a url dos seus exames exclusivamente e seleciona um exame /examinex/exames?exameId= 222 e o usuário joão /examinex/exames?exameId= 635, sendo que os dados dos exames são sigilosos, apenas josé deve visualizar seus exames então se joão digitar na url /examinex/exames?exameId= 222 deve cair em uma página de acesso negado. Supondo ainda que eu esteja utilizando JSF 2.2 a unica coisa que me vem em mente é ter na minha página de exame o seguinte:

    e no método init, eu recuperar o exame do banco de dados e checar se o exame encontrado pertence ao usuário na sessão,caso contrario redirecionar para a página de erro, mas acho isso bem braçal, gostaria de saber se existe algum outro mecanismo pra realizar esse tipo de autorização

      Fernando Franzini respondido:
      26/06/2014 às 09:50

      Faz isso que vc falou só que usando um servlet Filter…

Deixe um comentário