Artigo Java Magazine 69 - Spring Security
Aprenda a criar um mecanismo de autenticação e controle de acesso para sua aplicação web, de forma fácil e personalizável, superando em vários aspectos a segurança tradicional Java EE
[Artigo já está disponível no Leitor Digital DevMedia®. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Java Magazine 69
Spring Security
Segurança simples e independente de container
Aprenda a criar um mecanismo de autenticação e controle de acesso para sua aplicação web, de forma fácil e personalizável, superando em vários aspectos a segurança tradicional Java EE
De que se trata o artigo:
O artigo apresenta o projeto Spring Security como uma alternativa na área de segurança à tradicional especificação Java EE, através de um exemplo prático e realista.
Para que serve:
Com o Spring Security é possível criar um mecanismo de autenticação e autorização para sua aplicação web em questão de minutos. O framework foca em facilitar a implementação dos casos de uso mais freqüentes, porém oferece valiosos pontos de extensão para requisitos mais complexos. Por fim, disponibiliza suporte a inúmeros diferentes tipos de autenticação e integração com as mais usadas tecnologias na área de segurança.
Em que situação o tema é útil:
Para qualquer aplicação web que necessite restringir seus recursos para diferentes tipos de usuário, bem como assegurar que se autentiquem de forma prática e segura.
Spring Security:
O Spring Security surgiu da necessidade de melhorar o suporte à segurança oferecido pela especificação Java EE. O framework centraliza a configuração em um único XML, dispensando configurações do container e tornando a aplicação web um arquivo WAR auto contido.
Para começar a utilizá-lo basta adicionar seus JARs ao classpath, configurar um filtro e um listener no web.xml e criar um application context (XML de configuração). O XML centraliza todas as configurações de autenticação e autorização. As tags definem quais roles podem acessar cada grupo de URLs. A tag define a fonte de dados para as informações de usuários (banco de dados, arquivo de propriedades, LDAP, etc.).
Quando necessário, é possível utilizar os eventos publicados pelo framework a cada sucesso ou falha na autenticação ou autorização. Ouvir os eventos permite criar complexos casos de gerenciamento de usuários. O Spring Security ainda oferece integrações com a API de Servlets, taglibs para facilitar a codificação de JSPs, suporte à HTTPS, segurança em métodos com uso de anotações e suporte a autenticação com LDAP ou certificados X509.
Segurança é um requisito importante presente na grande maioria dos sistemas desenvolvidos. Na plataforma Java EE temos uma solução oferecida pela especificação que determina como uma aplicação pode definir regras de controle de acesso e autenticação. Entretanto, ainda é comum nos depararmos com soluções “caseiras” para cumprir tal requisito. Em parte, tais soluções são criadas pela falta de experiência dos desenvolvedores, ou por outro lado, porque a especificação não é flexível o suficiente para comportar os requisitos.
Com o objetivo de preencher a lacuna deixada pela especificação, em 2003 surgiu o Acegi Security System for Spring. O Acegi Security é conhecido por ser extremamente configurável e poderoso, porém difícil de utilizar devido à enorme quantidade de configuração XML necessária. Em 2007 o projeto Acegi foi incorporado dentro do guarda-chuva de projetos do Spring Framework Portifolio, e então, renomeado como Spring Security. Em abril de 2008 a versão 2.0.0 do Spring Security foi lançada tomando como proveito a configuração baseada em namespaces do Spring 2.0. Hoje, o Spring Security é extremamente fácil de configurar, sem perder a flexibilidade e o poder do antigo Acegi.
O Spring Security depende de alguns JARs do Spring Framework “core”. Entretanto, não é necessário que sua aplicação seja construída com o modelo de programação do Spring Framework. Ou seja, uma aplicação pré-existente que não usa Spring pode passar a utilizar o Spring Security sem grandes modificações. Para aprender mais sobre o Spring Framework consulte o artigo de capa da Edição 65.
Assim como o Java EE o Spring Security possui uma abordagem declarativa para segurança, baseada em roles (papéis). A abordagem é declarativa, pois a aplicação não precisa chamar nenhum método para realizar autenticação ou autorização, tudo é feito através de configuração XML.
Para configurar o Spring Security de forma declarativa, assim como no Java EE, é necessário declarar quais serão os roles envolvidos, quais os recursos que serão protegidos, e quais roles podem acessar cada recurso. Além disso, declara-se como a autenticação será feita (basic, digest, form login, LDAP, etc.).
Este artigo apresenta as características do Spring Security, mostrando alguns recursos importantes não presentes na especificação Java EE. Exemplos práticos serão construídos, abordando cenários frequentes que são requisitos de grande parte das aplicações web.
Os conceitos básicos sobre segurança não são abordados no artigo. Entretanto, o artigo de capa da Edição 22 descreve tais conceitos e demonstra exemplos práticos utilizando a especificação Java EE.
Primeiro exemplo
Como primeiro exemplo vamos criar uma aplicação web simples com duas áreas de acesso restrito: uma permitida para qualquer usuário autenticado (/usuarios/index.jsp) e outra apenas para usuários administradores (/admin/index.jsp). As páginas restritas apenas exibem uma mensagem e possuem um link de retorno à página principal. Espera-se que um login seja solicitado ao acessar qualquer uma destas áreas. A página inicial da aplicação (/index.jsp), ilustrada na Figura 1, tem acesso livre e possui links para as duas áreas restritas.
Figura 1. Página inicial da aplicação.
O código fonte dos três JSPs são HTML simples e portanto não serão exibidos nas listagens (estão disponíveis para download no site da Java Magazine).
Configurando o web.xml
O Spring Security utiliza-se de um filtro HTTP, declarado no web.xml (Listagem 1), para interceptar todas as URLs acessadas e conferir suas permissões de acesso. Por isso, o filtro é aplicado com o url-pattern “barra asterisco”. No Java EE tal filtro não é necessário, pois o controle de acesso é realizado pelo próprio container.
É importante notar que o nome do filtro é ‘springSecurityFilterChain’ e não deve ser alterado, pois o Spring Security já espera que o filtro esteja com este nome, por convenção.
No Java EE as configurações de autenticação e autorização são feitas no web.xml. No Spring Security são feitas em um application context padrão do Spring Framework. Dessa forma, precisamos do listener ContextLoaderListener declarado no web.xml para carregar o application context na inicialização da aplicação web. O atributo contextConfigLocation do listener indica a localização do application context, neste caso, na raiz do classpath com o nome spring-security-config.xml. O web.xml da Listagem 1 aplica essas configurações.
Application context é o nome dado aos XMLs de configuração do Spring Framework. Esses arquivos são genéricos o suficiente para configurar qualquer tipo de aplicação. Em casos específicos, como do Spring Security, namespaces são utilizados para reduzir a quantidade de XML necessária.
Listagem 1. web.xml – Configuração do Spring Security no web.xml
"
ATENÇÃO! A exibição deste artigo foi interrompida.
Clique aqui e acesse o Leitor Digital DevMedia para ler este artigo completo.

35 COMENTÁRIOS
Onde faço o download da aplicação ?

http://forum.springsource.org/showthread.php?t=57956&highlight=pattern+database

Aqui esta uma documentacao inicial.
Valeu.

Acho o Spring Secutiry um dos melhores produtos do Spring, o fato de você dar segurança a nível de métodos via annotations é muito bom.


Onde faço o download da aplicação ?

Fico no aguardo. Obrigado.
Já havia feito o que você indicadou, porém não resolveu.
O video continua sem condições de visualização.
abaixo do video no tamanho pequeno, há um link ([Clique aqui para ver em tamanho grande]). Ao clicar nele abre-se uma nova janela onde vc pode ver o video em tamanho maior.

tem como integrar o Spring Security com Struts 2?
O Spring Security tambem roda com a jdk 1.5 ?
Aguardo resposta.
outras dúvidas.
É possível usar o Spring Security sem o form login?
Eu só queria usar o Spring Security para controle de url's e para atribuir roles ao usuário.
Tem como usar recursos do Spring Security sem ser authenticado pela action j_spring_security_check, ou tem como implementá-la em classe java para atribuir papéis aos usuários na session?
É possível usar o Spring Security sem o form login?
- Sim, voce pode utilizar autenticacao por HTTP basic, certificados, etc...
Eu só queria usar o Spring Security para controle de url's e para atribuir roles ao usuário.
- E quem faria a autenticacao?
Tem como usar recursos do Spring Security sem ser authenticado pela action j_spring_security_check, ou tem como implementá-la em classe java para atribuir papéis aos usuários na session?
- Nao vejo motivo pelo qual nao deixar o SS cuidar disto, e se precisar de algo customizado estender alguma de suas classes. Mas, se voce configurar a autenticacao HTTP basic o form nao eh mais necessario.
Aconselho seriamente a considerar o form personalizado conforme no artigo, ou algum outro metodo de autenticacao suportado pelo SS.
Att,
Michel.

sei que já faz algum tempo que o artigo foi publicado, mas gostaria de saber como são feitos os certificados?
Att.
Wagner
Existem varias formas de gerar um certificado X509 para testes. A forma mais facil eh utilizando o proprio keytool do JDK (http://www.exampledepot.com/egs/java.security.cert/CreateCert.html)
Porem em uma aplicacao real possivelmente voce ira precisar gerar um keystore onde ira confiar em uma Autoridade Certificadora. Se nao estiver familiar com estes termos aconselho ler o artigo de capa da JM numero 22.
Abracos,
Michel.
Obrigado pela informação.
Att.
Wagner

Abs


tentei utilizar aqui o Spring Security com o JSF explorando a configuração do UserDetailsService, mas esbarrei num problema de ClassNotFoundException (referindo-se à classe que eu implementei para personalizar as funcionalidades do UserDetailsService). Eu suspeito que seja algum problema com a ordem de carregamento das classes, mas procurando no Google ainda não encontrei nada parecido. Você sabe alguma coisa sobre isso?
Att.,
Rande A. Moreira
O fato de ser utilizado com JSF nao deveria apresentar nenhuma problema neste sentido. Tentou conferir se esta no pacote correto? Caso o problema persistir pode copiar o application context e o stack trace pra mim? abracos
Michel
consegui resolver aqui. Já tinha verificado várias vezes o pacote e não tinha visto que tava faltando um diretório para completar o caminho.
Valeu.
outra dúvida. Agora consigo logar na aplicação, meu método loadUserByUsername é chamado e busca no banco como eu queria. Não sei em que ponto deveria ser chamado o createUserDetails (suponho que automaticamente pelo spring) mas ele não é chamado e o objeto que fica autenticado não é do tipo que eu gostaria. Verifiquei com modo Debug aqui e realmente não passa pelo método, o que poderia ser?
[]'s
Rande A. Moreira
Estou tentando fazer com jsf 2.0 e banco de dados, e não estou conseguindo, você teria esse projeto em jsf 2.0?
ou poderia me indicar alguns links.
Obrigado.
Space do autor



2
0
