DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

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






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.xmlConfiguraçã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

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Wallace Cardoso Pereira

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

[há +1 ano] - Responder

 

Devmedia - Equipe De Moderação
vc pode fazer o download através da opção "central de arquivos da revista java magazine" e a mesma lhe encaminhará para a página de donwloads da revistas, onde vc deve escolher a opção Java 69.
[há +1 ano] - Responder
 

Everton Amaral
Ql eh o Link do  "central de arquivos da revista java magazine"
[há +1 ano] - Responder
 

Everton Amaral
http://www.devmedia.com.br/resumo/download.asp?site=6&idrevista=125
[há +1 ano] - Responder
 

Everton Amaral
Michelzanini tem como criar URL-PATTER gerenciados pelo DB? como os usuarios?
[há +1 ano] - Responder

 

[autor] Michel Zanini
Acredito que eh possivel, porem nao vem pronto com o framework. Sera necessario implementar algumas interfaces e mudar algumas coisas no XML.
[há +1 ano] - Responder
 

[autor] Michel Zanini
Existe algumas solucoes postadas no forum do Spring Security:
http://forum.springsource.org/showthread.php?t=57956&highlight=pattern+database
[há +1 ano] - Responder
 

Everton Amaral
valeu... vou dar uma olhada
[há +1 ano] - Responder
 

Everton Amaral
Michel Zanini vc tem algum link de como fazer seguranção em metodos?
[há +1 ano] - Responder

 

[autor] Michel Zanini
http://static.springsource.org/spring-security/site/docs/2.0.x/reference/ns-config.html#ns-method-security

Aqui esta uma documentacao inicial.
Valeu.
[há +1 ano] - Responder
 

Hewerton Crisóstomo

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.

[há +1 ano] - Responder

 

Cristian Ribeiro Mietlicki
Boa tarde , tem como eu deixar essas permissões dinâmicas para que a administrador fale em quais paginas o usuario pode ter o acesso? obrigado.
[há +1 ano] - Responder

 

Wallace Cardoso Pereira

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

[há +1 ano] - Responder

 

Gilmar Ferreira Arantes
Vá em menu => central de arquivos da revista java magazine. Lá estão disponíveis os downloads da edição.

[há +1 ano] - Responder
 

Cristian R. Silva
Onde posso conseguir o video em melhor qualidade, pois o que está sendo apresentado é impossível de acompanhar.

Fico no aguardo. Obrigado.
[há +1 ano] - Responder

 

[autor] Michel Zanini
Tente clicar com o botao direito do mouse e selecionar "Full screen"
[há +1 ano] - Responder
 

Cristian R. Silva
Michel,

Já havia feito o que você indicadou, porém não resolveu.
O video continua sem condições de visualização.
[há +1 ano] - Responder
 

Devmedia - Equipe De Moderação
[há +1 ano] - Responder
 

Matheus Silva Santos
Michel,

tem como integrar o Spring Security com Struts 2?
O Spring Security tambem roda com a jdk 1.5 ?

Aguardo resposta.
[há +1 ano] - Responder

 

 

Matheus Silva Santos
Michel,

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?
[há +1 ano] - Responder
 

[autor] Michel Zanini
Michel,

É 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.


[há +1 ano] - Responder
 

Wagner Eduardo Batista
Olá, tudo bem?

sei que já faz algum tempo que o artigo foi publicado, mas gostaria de saber como são feitos os certificados?

Att.

Wagner
[há +1 ano] - Responder

 

[autor] Michel Zanini
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.


[há +1 ano] - Responder
 

Wagner Eduardo Batista
Olá Michel,

Obrigado pela informação.

Att.

Wagner
[há +1 ano] - Responder
 

Moacir Pereira Ramos Junior
O tipo de dados do Login não deve ser INT e sim varchar.

Abs
[há +1 ano] - Responder

 

Onezino Gabriel Moreira
EDVALDO , parabéns pelo artigo excelente qualidade.
Você pode me indicar alguma leitura para segurança a nível do EJB3.0 integrado a uma webapplication ?
[há +1 ano] - Responder

 

Rede Adok De Tecnologia Da Informacao
Boa tarde Michel,

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
[há +1 ano] - Responder

 

[autor] Michel Zanini
Rande,

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
[há +1 ano] - Responder
 

Rede Adok De Tecnologia Da Informacao
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.
[há +1 ano] - Responder
 

Rede Adok De Tecnologia Da Informacao
Michel,

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
[há +1 ano] - Responder
 

Rede Adok De Tecnologia Da Informacao
Resolvido, acabei achando aqui e na verdade no loadUserByUsername é que chama o createUserDetails pra retornar um objeto do tipo UserDetails. Espero ter entendido corretamente...
[há +1 ano] - Responder
 

Romilson Pereira Cardoso
Bom dia Michel, tudo bem?

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.

[há +1 ano] - Responder
 

Dyego Souza Do Carmo
Que eu saiba , não funciona direito com JSF 2.0
[há +1 ano] - Responder
 



Publicidade
Autor
Michel Zanini

Formado em Ciências da Computação pela Universidade Federal de Santa Catarina (UFSC) e possui as certificações SCJP, SCWCD, SCBCD e SCDJWS.


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
2   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]


Este post está fechado. Saiba mais sobre a assinatura MVP!
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03