Beruflich Dokumente
Kultur Dokumente
O Spring Security uma alternativa segurana oferecida pela especificao Java EE. O framework
centraliza as configuraes em um nico XML, dispensando configuraes do container, tornando a
aplicao web portvel.
Assim, todo o controle passa a ser feito de maneira declarativa, e na prtica isso significa retirar do
desenvolvedor a responsabilidade de ter que controlar o acesso a recursos por perfis de maneira
programtica, utilizando filtros, por exemplo.
Aplicativos web so formados por diversos recursos, como pginas dinmicas, estticas, imagens,
downloads, uploads, formulrios, relatrios, etc. Na maioria delas existe a necessidade de controlar o
acesso dos usurios a estes recursos, restringindo-o somente para aqueles previamente identificados e
autenticados. Portanto, toda aplicao, em especial as aplicaes web, deve apresentar maneiras de
alocar ou retirar permisses de seus usurios, atravs de mecanismos de controle de acesso como
autenticao e autorizao.
O Spring Security 3 um framework que tem como objetivo auxiliar na autenticao e autorizao dos
usurios das aplicaes. uma ferramenta simples de ser utilizada, porm, na integrao com JSF 2,
necessrio alguns cuidados que sero apresentados neste artigo. O framework surgiu da necessidade de
uma biblioteca de segurana Java robusta e adaptvel a diversos tipos de situaes. Apesar de existirem
ferramentas como o Java Authentication and Authorization Service (JAAS) e o Java EE Security, a
tecnologia da Spring Source uma opo diferenciada que prov um conjunto de funcionalidades de fcil
uso, alm de fornecer apoio para integrao com vrios outros sistemas de autenticao que podem j
existir na empresa ou ser de sua necessidade.
Neste contexto, o objetivo desse artigo ser, a partir de uma abordagem prtica, apresentar o
funcionamento do Spring Security, bem como mostrar a integrao com JSF e JPA. Ao final, o leitor
estar apto a construir aplicaes web seguras utilizando essas tecnologias.
Autenticao X Autorizao
Antes de entender como a segurana do Spring funciona, fundamental conhecer dois conceitos:
autenticao e autorizao. Esses conceitos j foram amplamente discutidos nas edies 87 e 88 da
revista, portanto caso o leitor j esteja familiarizado com eles, poder simplesmente passar para o
prximo tpico. No entanto, apresentamos abaixo no apenas os conceitos, mas tambm a relao deles
com o framework Spring Security.
Autenticao
A autenticao a verificao das credenciais (nome de usurio e senha) da tentativa de conexo. Esse
processo consiste no envio de credenciais do cliente para o servidor em um formulrio de texto simples
ou criptografado usando um protocolo de autenticao.
Como veremos mais adiante, o Spring Security possui vrias formas de realizar a autenticao.
Podemos utilizar, por exemplo, o formulrio de login que gerado automaticamente pelo framework ou
construir o nosso prprio formulrio personalizado. Os usurios da aplicao que sero autenticados
podem ser definidos diretamente no arquivo XML de configuraes do framework ou em um banco de
dados, como veremos neste artigo.
Autorizao
Autorizao utilizada para verificar se determinado usurio previamente autenticado possui permisso
para usar, manipular ou executar o recurso em questo. a concesso de uso para determinados tipos
de servio, dada a um usurio previamente autenticado.
O Spring Security possui uma abordagem declarativa para a segurana, baseada em roles (papis). Por
exemplo, uma aplicao de uma pousada poderia ter dois roles: um ADMIN, que possui permisso para
cadastrar acomodaes e reserv-las, e um COMUM, que possui permisso apenas para reserv-las.
Dessa forma os usurios que forem utilizar essa aplicao teriam que possuir algum desses roles.
que a implementao do JSF 2 que decidimos usar para esse exemplo. Finalmente, descrevemos um
filtro HTTP para interceptar todas as URLs acessadas e conferir suas permisses de acesso. Por isso, o
filtro aplicado com o url-pattern /*.
Configurando o faces-config.xml
Dentro do diretrio WEB-INF (veja a Figura 1) encontramos tambm o arquivo faces-config.xml, que o
arquivo principal de configurao de uma aplicao JSF. Ele responsvel por descrever os elementos e
sub-elementos que compem o projeto, tais como as regras de navegao, os beans gerenciados,
validadores, conversores, entre outros. Antes de continuarmos, veja como ficou a estrutura do nosso
faces-config.xml na Listagem 3. Nele configuramos as nossas regras de navegao e registramos o
ELResolver do Spring fazendo a integrao com JSF.
Configuraes do Spring
As configuraes do Spring so muito extensas e se dividem em configuraes gerais, do banco de
dados e de segurana. Assim sendo, uma boa prtica dividi-las em mais de um arquivo, deixando um
arquivo para cada tipo de configurao. No nosso exemplo, as dividimos em trs arquivos, conforme
mostrado na Figura
Para o nosso exemplo podemos ler esta tag da seguinte forma: todas as pginas que estiverem dentro da
pasta pages s sero acessadas por usurios autenticados. As demais pginas estaro disponveis para
qualquer usurio.
O objetivo da tag <form-login> configurar o caminho da pgina de login (atributo login-page), bem
como a pgina que o usurio ser redirecionado caso a login falhe (atributo authentication-failure-url).
Usando a tag <access-denied-handler> mapeamos a pgina que ser exibida quando um usurio tentar
acessar um recurso o qual no tenha autorizao.
Por fim, na tag <authentication-manager> definimos que o authentication-provider que o Spring Security
ir executar vai ser o userDetailsService. Explicaremos este recurso em mais detalhes quando formos
falar sobre o processo de autenticao.
Executando o exemplo
Deste modo terminamos as configuraes estruturais da aplicao que consistiram em criar as tabelas,
criar o projeto e configurar os arquivos XML para integrar o Spring, Spring Security, JSF, PrimeFaces e
JPA. Agora vamos rodar a aplicao e entender como o Spring Security realiza a autenticao e
autorizao da nossa aplicao. Para esse exemplo usamos o Tomcat 7 como servidor de aplicao,
porm, se desejar, voc pode usar outro servidor de sua preferencia.
Ao acessar a aplicao (http://localhost:8080/spring-jsf-jpa/) a primeira pgina que ser exibida a
home.xhtml (Figura 2). Como essa pgina est fora da pasta pages, ela pode ser acessada por todos
os usurios aplicao, at mesmo os que no estejam logados. Essa regra foi definida no arquivo
applicationContext-security.xml (Listagem
6).
A Listagem 7 apresenta a pgina home.xhtml onde temos o link aqui que redireciona a aplicao
para uma rea restrita (/pages/menu.xhtml).
Dessa forma, ao clicar nesse link o usurio automaticamente redirecionado para a pgina de login
(Figura 3), j que o usurio ainda no est logado. Veja que essa uma pgina de login personalizada.
Ela foi construda utilizando PrimeFaces 3 e bem diferente da pgina de login padro fornecida pelo
framework.
11.
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);
session.invalidate();
Caso positivo o Spring Security autentica o usurio e o adiciona no contexto de segurana do Spring
(SecurityContext).
Entidades
Para o nosso exemplo criamos duas entidades que representam o controle de acesso da aplicao, so
elas: User e Role. Esse um modelo bem tpico em aplicaes web, e caso o leitor deseje, poder
adicionar outros atributos ou mtodos nessas classes. Para que o Spring consiga gerenciar o usurio e
efetuar o controle de acesso, a entidade User, exibida naListagem
isAccountNonExpired() - indica se a conta do usurio expirou. Uma conta expirada no pode ser
autenticada;
isAccountNonLocked() - informa se o usurio est bloqueado ou desbloqueado. Um usurio bloqueado
no pode ser autenticado;
isCredentialsNonExpired() - mostra se as credenciais do usurio (password) expiraram. Se o password
tiver expirado, o usurio no pode ser autenticado;
isEnabled() - indica se o usurio est ativado ou desativado. Um usurio desativado no pode ser
autenticado.
Para os mtodos isAccountNonExpired(), isAccountNonLocked(), isCredentialsNonExpired() e
isEnabled(), simplesmente retornamos true, j que no nos interessa ter esse controle nesse exemplo.
Nos mtodos getPassword() e getUsername() retornamos, respectivamente, a senha e o login do usurio.
Por fim, no mtodo getAuthorities() construmos uma lista de autorizaes (GrantedAuthority) de acordo
com os Roles que o usurio possui. Conforme observado da Listagem 14, a entidade Role
representa as permisses ou papis do usurio no sistema.UserDetails do String, mostrada
na Listagem 13.
A interface UserDetails apresenta os seguintes mtodos:
getAuthorities() - retorna as permisses concedidas ao usurio. usado pelo framework para realizar o
processo de autorizao;
getPassword() - retorna o password usado para autenticar o usurio;
getUsername() - retorna o username usado para autenticar o usurio;
Testando a autorizao
Como voc j conhece o processo de autenticao, podemos testar a autorizao. Na tela de login,
exibida na Figura
3, entre com o usurio admin e senha 123. Ao efetuar o login voc ser
redirecionado para o home da aplicao (Figura 2). Em seguida clique no link aqui para acessar o
menu da aplicao. Note que como voc j est autenticado voc ser redirecionado para a pgina
menu.xhtml (Figura 4). Veja que os menus Cadastro e Segurana esto sendo exibidos, pois estamos
autenticados com um usurio que possui o role ADMIN. Esse controle de autorizao em nvel de pgina
15.
Essa tag utilizada para mostrar/esconder informaes (juntamente com o atributo rendered das tags
JSF) de acordo com as permisses (roles) do usurio logado. Ela possui trs atributos: ifAllGranted,
ifAnyGranted e ifNotGranted. Todos eles suportam um ou mais roles separados por vrgula. O atributo
ifAllGranted informa que o usurio tem que possuir todos os roles declarados para retornar true e assim
renderizar o contedo. O atributo ifAnyGranted necessita de apenas um dos roles para retornar true, e o
atributo ifNotGranted ser true apenas se o usurio no possuir nenhum dos roles.
Veja na Listagem 15 que utilizamos apenas ifAnyGranted dentro do atributo rendered da tag
<p:submenu> para dar as permisses de acesso ao menu do sistema. Isso significa que se o usurio
possuir qualquer um dos roles: ADMIN, SUPERVISOR ou COMUM, ter acesso ao menu Cadastro da
aplicao.
Por fim, ainda na pgina menu.xhtml, clique no link Logout e acesse a aplicao com o login comum e
senha 123. Veja que agora s aparece o menu Cadastro.
O menu Relatrio no foi renderizado porque este usurio s possui o role COMUM.
Concluses
Este artigo demonstrou como simples realizar a integrao do Spring Security 3, JavaServer Faces 2,
PrimeFaces 3 e JPA 2 para construir aplicaes web seguras. O leitor pode utilizar esse tutorial como
base para aplicar uma poltica de segurana mais complexa em suas aplicaes.
O Spring Security se mostrou um framework de fcil utilizao, pois trabalha com uma abordagem
declarativa para as configuraes de segurana, baseada no conceito de roles (papis). Atravs da
segurana declarativa, possvel habilitar a segurana por meio de configuraes na aplicao, o que
evita alteraes no cdigo. Dessa forma no necessrio chamar nenhum mtodo para realizar
autorizao de acesso a usurios em um sistema. Depois de definir os roles basta informarmos
aplicao quais recursos podem ser visualizados por um usurio que acessou uma rea restrita.
Uma outra vantagem de utilizar esse framework a portabilidade. Quando utilizamos a API de segurana
que o Java EE prov, fica difcil portar a aplicao, pois esta fica dependente de um servidor de aplicao
especfico. Diferentemente do Spring Security, que cria uma camada de abstrao da API de segurana,
tornando a aplicao portvel para qualquer servidor Java EE.