Boa tarde pessoal,
Já li tanta coisa a respeito deste assunto, já tentei tantas possibilidades que admito. Estou completamente perdido.
Gostaria de sugestões funcionais de como implementar segurança em uma aplicação SOA.
O spring-security esta funcionando. Porém, a interface principal da aplicação é swing. Minha questão principal é como autenticar o usuário e mantar a sessão autenticada enquanto a aplicação java estiver aberta.
Cheguei a implementar uma solução temporária utilizando aspectos, porém, não gostaria de deixar desta forma.
Resumindo, existe uma forma de alternativa de autenticar um usuário no springsecurity sem ser através do formulário web? Tipo, criar um método que recebe as credenciais e então, autentica e valida a sessão atual.
Arquitetura:
Client : Swing com webstart
Server : JAX-WS, spring, spring-security e jpa
[]'s
Então, em uma aplicação JAX-WS, o mais recomendado é utilizar WS-Security. Com isso, você tem uma ampla gama de soluções:
- Passar usuário/senha para suas requisições. Provavelmente, não vai resolver seu problema de manter uma sessão, mas sem dúvida é o mais fácil de implementar.
- Utilizar um servidor WASP ou Kerberos para levantamento de tokens / tickets. Isso é um pouco mais complicado de fazer, mas se você fizer, você só vai ter o trabalho de manter a passagem de tickets, ao invés de usuário/senha (e leva de brinde Single Sign-On).
Quanto à implementação, o Spring-WS facilita bastante esses procedimentos com WS-Security. Dá uma olhadinha, vão te ajudar bastante.
[]'s
P.S: Infelizmente, o spring-security não vai te ajudar muito nisso. Isso porque, numa topologia típica SOA, ele vai fazer a proteção do cliente, e não dos serviços. O ideal para você, nesse caso, seria armazenar o usuário e senha passados na sua aplicação Swing e passá-los a cada requisição. Eu sei, it sucks, maaas… =/
Ah, um adendo… se você precisar mesmo “manter sessão” entre chamadas, talvez seja mais fácil fazer com REST, já que o modelo HTTP prevê uso de cookies e tudo o mais. Pra usar com Spring Security também fica mais fácil.
EDIT: não que isso seja compliant com a técnica REST em sí, já que, idealmente, todo web service (WS-* ou REST) deve ser stateless.
[]'s
Partindo então da premissa que todo ws ou requisição rest deve ser stateless, o mais correto então seria uma abordagem onde para cada chamada de serviço, seja adicionado ao header da mensagem as credenciais. Vou dar uma olhada no WS-Security …
Obrigado pelas dicas.
Cheguei a seguinte conclusão:
Meus serviços serão protegidos, porém o nível de proteção que eu tenho é definido pela própria aplicação ( roles do sistema ) mais os usuários do rede interna da empresa. (LDPA, AD ou etc).
Sendo assim, então eu sempre recupero o usuário logado no sistema (usuário de rede) e com esta chave, verifique se este usuário esta cadastrado no sistema e suas respectivas roles.
Na aplicação servidor eu criei um interceptador usando aspecto onde ele é acionado todas as vezes que encontra a anotação @javax.jws.WebService ou @javax.jws.WebMethod …
Criei então um Pointcut que é ativado em uma destas duas situações.
Porém, somente as 2 anotações não significa protegido. Significa verificado. Para verificar a segurança, o método que deve ser seguro precisa ser anotado com uma anotação que eu criei chamada @Secure que recebe como parâmetro as roles que tal método aceita.
Se o método for anotado então com a anotação @Secure a lógica de segurança é ativada e verifica se o usuário que esta solicitando o serviço possui privilégios suficiente para chamar o serviço. Caso ele não tenha o privilégio, disparo uma exceção com uma mensagem.
Olhando as sugestões que foram dadas eu teria um pouco de problemas no que se diz respeito ao uso de chaves publicas e privadas e que também não quero obrigar o client da aplicação a ser um container spring e sim somente um jar que chama os serviços.
Obrigado pelas dicas =) foram muito úteis.
Ah, uma coisa: você pode checar se seu servidor dá suporte a JAAS. Nesse caso, bastaria você configurar um provider, não precisa fazer acesso programático nem nada assim.
[]'s