Login Unico entre Aplicações Web em Servidores Diferentes

17 respostas
L

Boa tarde galera,

Estou com uma dúvida referente ao compartilhamento de usuário em varias aplicações Web. Deixa eu me explicar melhor, na empresa que eu trabalho nos temos uma aplicação Web que será dividida entre vários módulo gerando várias aplicações, e preciso validar uma maneira que o usuário se loga em uma aplicação e ao acessar outra não precisa se logar novamente. Andei pesquisando sobre Single Sign On mas pelo que eu verifiquei só pode ser utilizado quando as aplicações estarem no mesmo domínio, e não funciona no meu caso que nem sempre estarão, pode estar em servidores diferentes. Pesquisei também sobre cross domain cookie onde poderia gravar informações da sessão em um cookie, e lendo em outra aplicação as informações do usuário, mas como não tenho certeza que as aplicações estarão no mesmo servidor de aplicação, acho que não iria funcionar, um amigo mencionou sobre OAUTH mas não intendi muito bem, parece que ele se autentica gerando 2 tipos de chaves uma privada e uma publica, depois essas chaves gerarão acesso a aplicação. Mas oque gostaria mesmo é uma dica se alguem já teve que fazer isso, hj eu tenho um JSP de login onde faço a validação do usuário e crio a sessão para ele, pensei quem criar um outro JSP e passar o usuário e senha como parâmetro na URL mas acho isso muita gambiarra, quero fazer algo mais seguro!

Alguem tem alguma dica ai ?

17 Respostas

L

Se seu servidor é Glassfish, tem um livro excelente que ensina fazer o que voce quer: http://www.amazon.com/GlassFish-Security-Masoud-Kalali/dp/[telefone removido]/ref=sr_1_1?ie=UTF8&qid=[telefone removido]&sr=8-1

A

Cara,

uma boa ideia seria vc fazer um web service, aonde vc passaria usuario, senha e aplicação e o retorno te daria se o usuario está autenticado. Se nao me engano o google é assim.

t+

L

Respondendo ao Lucas, então meu Servidor de Aplicação é o Apache Tomcat!

Alison, então sobre web service eu teria que fazer uma aplicação onde teria somente o login e essa disponibilizaria o serviço e os modulos(aplicações) consumiriam o login desse certo? Então não sei se é esse o caminho pois o consumo da aplicação é alto (Quantidade de Usuarios) e o acesso aos outros módulos seria apartir de dentro dessa aplicação logada (a primeira que ele entrou). O lance do cookie me pareceu legal, so que eu não consigo ler ele de dominio diferente (pelo menos eu acho).

So para exemplificar como ficará a aplicação é o seguinte. Vou ter a App1, App2, App3, quando logado na App1, apresentará 3 abas no inicio do HTML e cada aba dará acesso ao modulo diferente(Apps), mas ele pode se logar em qualquer um de inicio. Na verdade se eu conseguiça apenas compartilhar o usuario e senha para mim acho q ja dara certo.

A

Entao Luis,

se vc fizesse o web service com cookie, nao seria uma boa ideia. Agora em relação a quantidade de usuario, acho q não seria um problema. O google msm quando loga em um aplicação deles vc pode reparar que vc se autentica sempre em uma msm url, e quanto usuarios o google nao tem.

t+

F

Não existe Single Sign On em múltiplos devidores uma vez que o protocolo HTTP é desprovido de recursos padrões para carregar informações de credenciais. Isso não existe e não faz sentido!!! Vou sugerir alguns caminhos:

1) Usar alguma gambiarra ou recursos proprietário de algum container que fornece esse nível ser serviço
Eu realmente desconheço esse modelo arquitetural e quem souber de alguma coisa favor compartilhar…

2) Colocar todos os war dentro do mesmo servidor
Vc pode montar um tomcat tunado e clusterizado para usar o Single Sign On entre os aplicativos web.
Quais são reais restrições?

L

Boa tarde Fernando, a ideia do Alison realmente é muito boa, se eu montar um serviço de web service em cada modulo(aplicação), onde se eu estiver na App1 e requisitar acessar a App2, a App1 ja passará o usuario e senha como requisição do serviço, isso irá resolver meu problema, eu vou iniciar um teste com Rest, creio que para meu problema posso resolver, pois não tenho como controlar onde as aplicações irão ficar pois o cliente pode separar os Servidores de Aplicação como bem intender, isso que complica a história. Mas assim que tiver uma resposta eu posto aki.

Valeu pela ajuda !!!

F

luisbizzan:
Boa tarde Fernando, a ideia do Alison realmente é muito boa, se eu montar um serviço de web service em cada modulo(aplicação), onde se eu estiver na App1 e requisitar acessar a App2, a App1 ja passará o usuario e senha como requisição do serviço, isso irá resolver meu problema, eu vou iniciar um teste com Rest, creio que para meu problema posso resolver, pois não tenho como controlar onde as aplicações irão ficar pois o cliente pode separar os Servidores de Aplicação como bem intender, isso que complica a história. Mas assim que tiver uma resposta eu posto aki.

Valeu pela ajuda !!!

Acho que não vai dar certo…O REST vai abrir uma sessão HTTP diferente do navegador da aplicação…vc não vai conseguir propagar a sessão aberta interna do cliente REST para dentro da pagina navegada…
Simplesmente não da…

L

Fernando então meu problema não é propagar a sessão, e sim somente autenticar a aplicação com o usuario ja logado na primeira aplicação, pois ele irá ter sessões diferentes, uma vez que ele pode fazer logoof em qualquer aplicação assim ficará independente uma da outra, entao acho q o web service realmente irá me ajudar. Bom só um teste mesmo para provar isso, amanha ja irei validar isso !!! Abraço

L

Single Sign-On é possível sim, sem gambiarras.

Deu uma olhada no OpenSSO? Ele gerencia segurança de recursos de vários servidores como GF, Tomcat, Weblogic, etc.

É um Single Sign-On. Voce pode trafegar várias aplicações com identificação única.

Ele possui um Identity Web Service, SOAP-based ou Restful.

F

Legal em lucas…não sabia disso não…
Vou dar um estudada no OpenSSO.
Sobre web services eu ainda acho q não da certo! Mas ok…faça o teste e vc vera que não tem como propagar a sessão HTTP aberta para o cliente REST para dentro do navegador.

L

Lucas vc tem alguma documentação da implementação do OpenSSO? E outra coisa, vc precisa inserir as ações de validação no servidor de aplicação ?

Abraço

L

luisbizzan:
Lucas vc tem alguma documentação da implementação do OpenSSO? E outra coisa, vc precisa inserir as ações de validação no servidor de aplicação ?

Abraço

Na verdade existe muito pouco material para estudar o OpenSSO. No livro que citei acima: Glassfish Security (muito bom livro, leia quando puder), tem um capítulo excluisvo (Capítulo 7) para OpenSSO, e explica ele por quase completo, desde conceito básico, arquiteturas, Indentity Webservice, Restful, etc. E por fim ensina a configurá-lo no Glassfish.

O mais legal é que alem dele conseguir integrar identificação unica com várias App Server como GF, Jboss, Tomcat e Weblogic, pode usá-lo com aplicações feitas em C++, Ruby, etc.

@FernandoFranzini voce tem razão, não tem como gerenciar sessão HTTP por REST.

No caso do SSO Restful service, voce tem serviços para Autenticação do usuario e Autorização de acesso aos Recursos. Ele possui um mecanismo semelhante ao SessionID HTTP para gerenciamento de sessão.

F

FernandoFranzini:
Legal em lucas…não sabia disso não…
Vou dar um estudada no OpenSSO.
Sobre web services eu ainda acho q não da certo! Mas ok…faça o teste e vc vera que não tem como propagar a sessão HTTP aberta do cliente REST para dentro do navegador.

L

Boa tarde Fernando, então estou aki na luta com o rest cara eu estou tentando pegar os Ids da sessão abertos na minha aplicação so que não sei se funciona o HttpServletRequest

Não esta funcionando, olha meu código:

import java.util.Collection;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import org.apache.catalina.Session;

@Path("/validausr")
public class ValidaUsuario {
    @GET
    @Produces("text/plain")
    public String showHelloWorld(HttpServletRequest request) {
        Collection activeSessions = (Collection) request.getAttribute("activeSessions");
        Iterator iter = activeSessions.iterator();
        String resp = "";
        while (iter.hasNext()) {
            Session currentSession = (Session) iter.next();
            resp = "..."+currentSession.getId();
        }
        return resp;
    }
    
}

Tem alguma outra maneira de buscar o request no Rest ?

Abraço

F

Nem sei oq te responder…na especificação não tem como pegar as outras sessão a não ser a corrente do usuario!!
Acho que vc tem usar implementação proprietária para acessar TODOS os objetos session do seu container

L

É Fernando agora não sei oque fazer, pois a solução do OpenSSO teria que inserir um jar no servidor de aplicação certo? Mas eu queria controlar isso apenas na aplicação, se eu consegui-se fazer um serviço que ele me valida-se o login e o ID da Sessão, ja seria o suficiente para oq estou precisando.

F

Vc parece que quer a coisas no milagre meu !!! kkkkkkkkkkkkkkkkkk
A questão é …cada aplicação separada é sessões diferentes… não tem um “milagre do alem” que integre tudo isso sem contornos ou configurações…

Criado 12 de setembro de 2011
Ultima resposta 13 de set. de 2011
Respostas 17
Participantes 4