Obtendo IP Cliente dentro de um LoginModule JAAS

8 respostas
S

Olá pessoal, boa tarde!
Estou precisando de uma ajudinha dos Gurus hehe…

Preciso desenvolver um módulo de Login JAAS que irá autenticar usando um Web Service que trabalha com o repositório central de SSO. O problema que tenho é que o mesmo recebe como parâmetro (não sei por qual motivo, mas enfim) o IP da máquina cliente que está tentando se autenticar, assim como o domínio e o usuário que esta Workstation está logada na Rede Windows (Active Directory), ou seja, dentro do método login() do LoginModule customizado eu tenho que encontrar o IP, usuário e domínio da estação que está tentando entrar.
Isto é possível? Existe algum jeito de saber quais estes dados através do LoginModule, ou até fazer um “bacalhau” usando um Filter ou coisa parecida? Apesar que se possível eu prefiro manter a idéia de usar JAAS ao invés de um Filter, para usar o padrão de mercado e facilitar a plugabilidade né…

Agradeço desde já!
Abraços!

8 Respostas

Sokoban

Estou com um problema muito parecido, só que ao invés de precisar mandar o IP do cara como parâmetro, eu preciso passar o SessionID.

Pelo visto é necessário implementar um novo CallBack para o terceiro parâmetro na mão…

Mas o que mais além disso precisa ser feito ? :roll:

Alguem aí tem alguma idéia de como adicionar parâmetros extras na autenticação do JAAS ?

sergiotaborda

não entendi muito bem qual seria o problema… loginmodules podem ser fabricados. basta implementar um.
Quanto ao ip basta usar InetAdress . Cuidado com o 127.0.0.1 que sempre existe.
Quando ao sessionID, sessionID do quê ? do servidor web ? Vc pode pegar usando o session. Para fazer isso dentro do loginmodule vc previsa de uma ginastica. implemente um session listener que o informa quando as sessções são criadas e destruidas. Um objeto deve ouvir isso. o login module deve consultar esse objeto. O problema tlv seja saber qual id pertence a qual module de login. sem mais detalhes é complicado saber…

Sokoban

sergiotaborda:
não entendi muito bem qual seria o problema… loginmodules podem ser fabricados. basta implementar um.
Quanto ao ip basta usar InetAdress . Cuidado com o 127.0.0.1 que sempre existe.
Quando ao sessionID, sessionID do quê ? do servidor web ?

Seguinte, aparentemente tanto eu quanto o usuário souzatg precisamos enviar um parâmetro a mais para o LoginModule.
E essa é a dúvida comum à ambos. :wink:

Agora, a razão de eu precisar fazer isto é o seguinte (espero não atrapalhar o tópico com minha dúvida, qualquer coisa me dêem um toque que eu abro em um tópico diferente):

Estou tendo o velho e famigerado “The requested resource (/…/j_security_check) is not available”, várias vezes relatado por usuários deste fórum: :cry:

http://www.guj.com.br/posts/list/18712.java
http://www.guj.com.br/posts/list/51388.java#270556
http://www.guj.com.br/posts/list/47813.java#249931
http://www.guj.com.br/posts/list/64193.java#337494
http://www.guj.com.br/posts/list/14529.java#75657

Já vimos que o erro acontece quando um usuário tenta fazer uma requisição de login quando já existe aquele Session ID logado.
Para repoduzí-lo, por exemplo, basta abrir duas páginas de login em duas abas do mesmo browser, logar em uma, e em seguida tentar logar na segunda tela - com qualquer usuário e senha (isso não importa já que o erro acontece antes da validação que acontece dentro LoginModule).

Já que não há como consertar o erro (problemas estruturais do sr.tomcat), então o jeito é evitar que ele aconteça.

Eu já fiz isso! Mas dessa forma não funciona. :frowning:

Eu só posso adicionar uma sessão uma vez que o login foi realmente feito com sucesso (dentro do LoginModule). E lá eu não tenho acesso ao objeto Request ou nada parecido que possa me informar o SessionID daquele Usuário.

Exatamente, por isso que eu preciso ter controle das sessões efetivamente LOGADAS no sistema (que já fizeram o request de autenticação).
Saber apenas quais são as sessões criadas não ajuda muito.
Desta forma, eu preciso passar esse SessionID de alguma forma lá pra dentro do LoginModule.

Alguma idéia ?

sergiotaborda

Como eu disse não use o LoginModule padrão. Crie o seu.

não sei se ajuda

http://roneiv.wordpress.com/2008/02/18/jaas-authentication-mechanism-is-it-possible-to-force-j_security_check-to-go-to-a-specific-page/

G

Alguém resolveu esse problema?

Eu uso um LoginModule meu (ou seja, a ultima solução proposta nesse tópico não é suficiente pra mim) só que eu preciso pegar o IP do cliente, se eu tivesse um request seria fácill (com um request.getRemoteAddr()). O problema é que o LoginModule não recebe um request, também não consegui achar onde ele pega o valor do text field lá do form pelo request, afinal em algum lugar ele tem que fazer isso. Cheguei a dar uma olhada, pensei em criar um Callback só pra isso (um chute) e não cheguei a lugar nenhum.

Alguém tem alguma sugestão?

F

Já fiz isso. Eu uso o jboss e só funciona nas ultimas versões 4.x.x. No momento estou fora do meu computador assim que eu puder posto a solução.

Abraço,

Fred

F

import javax.security.jacc.PolicyContext;

try {

request = (HttpServletRequest)PolicyContext.getContext(“javax.servlet.http.HttpServletRequest”);

} catch (PolicyContextException e) {

throw new LoginException(e.getMessage());

}
G

Perfeito, valeu!

Criado 12 de fevereiro de 2008
Ultima resposta 25 de ago. de 2008
Respostas 8
Participantes 5