Olá desenvolvedores, neste tutorial implementaremos um filter para autenticação de usuário logado. Isto é, uma classe que irá validar o pedido de acesso ao sistema, se a requisição for validada a resposta será um redirecionamento para a tela que dá acesso as demais telas do sistema, e a sessão será iniciada.
No entanto, se as credenciais de acesso ao sistema não forem validadas pelo filter o acesso a qualquer ambiente do sistema será negado. Quando o acesso é negado o usuário é redirecionado para a tela de login.
BIBLIOTECA JSTL
Antes de dar início a implementação do filtro de autenticação, baixe por meio do Maven a biblioteca JSTL – JavaServer Pages Standard Tag Library. Ela é um componente que estende a especificação JSP – JavaServer Pages, adicionando uma biblioteca de tags das tags JSP para tarefas comuns, tais como processamento de dados XML. Faça o download e adicione a biblioteca dentro da pasta lib do projeto.
MAPEANDO O JSP
Na página web.xml por meio do mapeamento MIME adicione uma nova definição de mapeamento, isto é, a extensão associada ao nome do arquivo associado, o JSP.
IMPLEMENTANDO O FILTER
Crie um pacote na raiz do src/main/java, atribua a ele o nome de “br.com.filter” dentro do pacote crie a classe “FilterAutenticacao”. A classe deverá ser mapeada com a anotação @WebFilter do pacote javax.servlet.annotation, defina por meio da urlPatterns qual página será interceptada pela classe, neste caso, serão todas, o que podemos indicar por meio do asterisco (/*). A classe implementa ainda o “Filter” do javax.servlet.
O Filter exige a implementação de alguns métodos, onde os principais são o doFilter() que será executado em todas as edições e o init() que somente é executado quando o servidor é iniciado. Desse modo é o init() o responsável por dar início (“levantar”) a conexão com o banco de dados, criando o EntityManager.
MÉTODO DOFILTER()
No método doFilter() onde trabalharemos de fato a parte de autenticação da aplicação, substitua as variáveis arg0, arg1 e arg2 por request, response e chain respectivamente.
A nossa primeira responsabilidade dentro do doFilter() é invocá-lo juntamente com os argumentos request e response. Como toda requisição e resposta passa dentro do Filter, ocultar o método implicaria em erro na aplicação, uma vez que o request e o response não seriam completados. Assim todas as implementações da página ocorrerão antes da chamada de
chain.doFilter(request, response)
Precisaremos obter todos os dados do objeto que está fazendo a requisição e da sessão da requisição. É dentro desta sessão que os dados do usuário logado estarão carregados.
String usuarioLogado = (String) session.getAttibute(“usuarioLogado”);
Assim, depois de obtido o objeto Pessoa, o próximo passo é obter o endereço da página que o usuário está acessando.
String url = req.getServletPath();
Então se a URL que o usuário está tentando acessar for diferente da página de login, ou seja, se for diferente de index.html e se o usuário logado estiver nulo ou vazio o RequestDispatcher o redirecionará para a página de autenticação index.jsf, e executará concluindo a requisição por meio do “forward”.
Mas se não, se a sessão já estiver aberta, o fluxo de processamento passará por fora da implementação da primeira condição e o acesso será liberado.
EM POUCAS PALAVRAS
Neste tutorial implementamos a classe Filter responsável pela validação da autenticação do usuário, redirecionando-o de acordo com a resposta a requisição, seja dando acesso ao sistema ou mandando o usuário de volta para a tela de login