Spring Security: Integrando Spring com Java EE

Neste artigo mostraremos como aproveitar os mecanismos de autorização e autenticação do Spring Security em uma aplicação web Java EE 7 que utiliza JSF 2.2, CDI 1.1 e JPA 2.1.

O emprego de mecanismos poderosos de segurança em uma aplicação web é, na grande maioria dos casos, um requisito que não pode ser ignorado. A exploração de uma falha no sistema pode resultar em prejuízos financeiros incalculáveis para uma organização e causar demissões em massa na equipe do projeto.

Nestes cenários em que se deseja proteger os sistemas, é sempre recomendada a adoção de camadas de segurança implementadas pelas equipes envolvidas no projeto. Em um ambiente corporativo, estas camadas costumam estar divididas em quatro, sendo a primeira relacionada diretamente à infraestrutura, compreendendo o acesso dos usuários a servidores, seja ele físico ou lógico. Na camada seguinte, há o envolvimento da estrutura de rede, na qual contamos com firewalls, VPNs e DMZs para limitar a visibilidade de uma rede ou IP. Além destes equipamentos, normalmente utiliza-se um sistema de detecção de ataques para evitar problemas com DoS (Denial of Service) ou algoritmos de força bruta. Subindo mais uma camada, temos a Máquina Virtual Java, que implementa uma série de controles de segurança baseados em permissões concedidas a tipos primitivos e classes da linguagem para evitar a exploração de uma brecha no código. A última camada – e talvez a mais importante de todas – trata do controle de segurança nas aplicações e está ligada, principalmente, aos mecanismos de autenticação e autorização.

Como uma resposta para a necessidade de haver uma boa solução para aplicações Java no que diz respeito à quarta camada, surgiram diversas opções de bibliotecas que tentam combater ataques e exploração de falhas no projeto, como acesso não autorizado a recursos, leitura de dados confidenciais de usuários e até mesmo uma invasão no sistema.

Neste artigo, veremos como utilizar os mecanismos de autenticação e autorização do Spring Security em uma aplicação web que simula o funcionamento de uma locadora. O sistema rodará com JSF 2.2, CDI 1.1 para injeção de dependências e JPA 2.1 para acesso a uma base de dados no PostgreSQL. Além destes três frameworks, o Maven será configurado para gerenciamento das dependências e do build, e nosso servidor de aplicação será o WildFly 8.0.

O JavaServer Faces 2.2

O JavaServer Faces é um framework MVC orientado a eventos lançado em 2004 para a construção da camada de visão através do uso de componentes. Desde o seu primeiro release, a biblioteca vem ganhando cada vez mais adeptos, por se tratar de um produto oficial Java EE e apresentar um grande envolvimento de usuários na especificação da JSR.

Na versão 2, o JSF trouxe algumas novidades importantes, como o fim da necessidade de declarar os Managed Beans e as regras de navegação no faces-config.xml, um novo escopo entre requisição e sessão chamado ViewScope, suporte nativo a Ajax, possibilidade de usar bookmarking (ver BOX 1), entre outros.

Como qualquer outro produto de mercado, entretanto, o JavaServer Faces continua passando por aprimoramentos, e a versão 2.2, lançada em abril de 2013, não poderia deixar de lado novos recursos fundamentais. Entre eles, podemos citar:

• Adição de suporte ao escopo FlowScoped;

• Maior integração com o CDI;

• Melhoria no suporte a HTML5;

• Proteção contra ataques do tipo CSRF (Cross-Site Request Forgery).

BOX 1. Bookmarking

Refere-se à possibilidade de colocar uma página interna do sistema como um favorito do navegador para poder voltar a ela de forma direta posteriormente. Muito utilizado em sites de compras, de pesquisa, entre outros.

O Spring Security 3.2

O Spring Security foi lançado em 2003 com o propósito de incorporar recursos avançados de segurança à plataforma Java EE. Assim como os concorrentes, a biblioteca dispensa a realização de configurações no servidor de aplicação, facilitando o trabalho da equipe do projeto em uma possível migração de container.

Embora o framework faça parte do conjunto de projetos Spring, ele pode ser utilizado em sistemas Java com as mais diversas arquiteturas, independentemente de ter sido incorporada ou não a biblioteca com o core do Spring. Na versão 3.2, os principais recursos fornecidos pelo Spring Security são:

• Suporte extensível para autenticação e autorização;

• Proteção contra ataques de fixação de sessão, CSRF (Cross-Site Request Forgery) e clickjacking;

• Integração com a API de Servlets;

• Possibilidade de configuração da segurança utilizando apenas código Java, ou seja, sem o uso de arquivos XML.

Criando a aplicação

A partir de agora, criaremos um pequeno sistema de locadora para demonstrar os principais recursos do Spring Security. A injeção de dependências será feita pelo CDI e o papel de controller caberá ao JSF 2.2. O banco de dados com os usuários cadastrados para autenticação na aplicação será acessado através da JPA 2.1 e constarão dois perfis de acesso: administrador e operador. O perfil administrador terá permissão de realizar qualquer operação no sistema, enquanto o usuário operador não poderá cadastrar filmes.

O ambiente requerido para implementar o sistema envolverá os softwares listados a seguir, que precisam estar instalados na máquina em que a implementação dos exemplos deste artigo será feita (se necessário, confira a seção Links no final do artigo para saber onde baixá-los):

• Servidor de aplicação WildFly 8.0.0. Se quiser saber mais detalhes sobre como configurá-lo, consulte a Java Magazine 128;

• Eclipse Kepler para desenvolvedores Java EE;

• Java Development Kit versão 1.7 configurada no Eclipse;

• SGBD PostgreSQL 9.3.

Agora que temos todos os softwares configurados na máquina, vamos criar o projeto Maven. Para isso, na view Project Explorer do Eclipse, clique com o botão direito, selecione New e clique em Other.

Na tela que surge, selecione Maven e depois clique em Maven Project. Marque a opção Create a simple Project (skip archetype selection) e clique em Next. Neste passo, informe no campo Group Id o valor “br.com.javamagazine”, no Artifact Id o valor “locadora”, no Packaging o valor “war” e no Name o valor “locadora”. Em seguida, clique em Finish.

Logo após, vamos configurar nosso projeto para utilizar o JSF 2.2 e informar alguns parâmetros adicionais para a aplicação rodar corretamente. Assim, clique com o botão direito em cima da raiz do projeto, e depois na opção Properties. Na tela que surge, clique em Project Facets. No item Dynamic Web Module, selecione a versão 3.1 para trabalharmos com a versão mais recente da API de Servlets. No item Java, selecione a opção 1.7 e marque o item abaixo, JavaServer Faces, selecionando posteriormente a versão 2.2 do framework. Mais abaixo, surgirá a mensagem Further configuration available informando que é preciso confirmar alguns parâmetros do JSF. Clique nela e informe as seguintes configurações para o funcionamento da aplicação: em JSF Implementation Library, deixe marcado Disable Library Configuration; no campo URL Mapping Patterns, clique em cima da opção existente (/faces/*) e depois no botão Remove. Feito isso, clique no botão Add e no popup que aparece, informe “*.xhtml”. Então, clique em OK na primeira tela, em OK na segunda e novamente em OK na terceira para confirmar as mudanças.

Nosso próximo passo será informar o uso da versão 3.1 da API de Servlets no web.xml e configurar a página inicial do sistema. Para realizar esta alteração, abra o arquivo mencionado, que se encontra na pasta src/main/webapp/WEB-INF, e informe o código presente na Listagem 1.

Listagem 1. Código do arquivo web.xml.

01 <?xml version="1.0" encoding="UTF-8"?> 02 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 03 xmlns="http://xmlns.jcp.org/xml/ns/javaee" 04 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 05 06 <display-name>locadora</display-name> 07 08 <welcome-file-list> 09 <welcome-file>inicio.xhtml</welcome-file> 10 </welcome-file-list> 11 12 <servlet> 13 <servlet-name>Faces Servlet</servlet-name> 14 <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 15 <load-on-startup>1</load-on-startup> 16 </servlet> 17 <servlet-mapping> 18 <servlet-name>Faces Servlet</servlet-name> 19 <url-pattern>*.xhtml</url-pattern> 20 </servlet-mapping> 21 </web-app>

Modificando o pom.xml

Como iremos utilizar várias bibliotecas diferentes não fornecidas diretamente pelo JDK no projeto, precisamos configurá-las no pom.xml. Deste modo, clique duas vezes sobre ele e selecione a aba pom.xml para editar o código fonte, que deve ficar semelhante ao da Listagem 2.

Listagem 2. Código do arquivo pom.xml.

01 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 02 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 03 <modelVersion>4.0.0</modelVersion> 04 05 <groupId>br.com.javamagazine</groupId> 06 <artifactId>locadora</artifactId> 07 <version>0.0.1-SNAPSHOT</version> 08 <packaging>war</packaging> 09 10 <name>locadora</name> 11 12 <build> 13 <plugins> 14 <plugin> 15 <artifactId>maven-compiler-plugin</artifactId> 16 <version>2.0.2</version> 17 <configuration> 18 <source>1.7</source> 19 <target>1.7</target> 20 </configuration> 21 </plugin> 22 </plugins> 23 </build> 24 25 <dependencies> 26 <!-- Bibliotecas JavaEE 7 que já estão no Wildfly, incluindo o JSF 2.2 --> 27 <dependency> 28 <groupId>javax</groupId> 29 <artifactId>javaee-api</artifactId> 30 <version>7.0</version> 31 <scope>provided</scope> 32 </dependency> 33 34 <!-- Spring Security --> 35 <dependency> 36 <groupId>org.springframework.security</groupId> 37 <artifactId>spring-security-web</artifactId> 38 <version>3.2.3.RELEASE</version> 39 </dependency> 40 <dependency> 41 <groupId>org.springframework.security</groupId> 42 <artifactId>spring-security-config</artifactId> 43 <version>3.2.3.RELEASE</version> 44 </dependency> 45 </dependencies> 46 </project>" [...] continue lendo...

Artigos relacionados