Em um dos clientes que eu estamos atendendo na empresa, um dos requisitos é autenticar no RACF, uma espécie de LDAP para o Mainframe. Nosso cliente, disponibilizou um WS que faz este trabalho "sujo". Nos resta então criar um LoginModule que suporte esta nova funcionalidade.
Quando você proteger Aplicações em Java é importante saber onde você pode se conectar, o JBoss oferece por padrão alguns LoginModules, entre eles:
-LoginModule baseado em arquivos properties
-LoginModule baseado em Banco de Dados
-LoginModule para LDAP
Em nossa solução, estaremos promovendo mais um LoginModule. O primeiro passo é alterar o login-config.xml dentro de /default/conf, no caso adicionamos mais um LoginModule, como a seguir:

Adicionamos até uma propriedade, que é o WSDL do Serviço, que pode variar dependendo do caso, e ai a configuração poderá ser feita no LoginModule, sem a necessidade de recompilação.
Estamos dizendo acima que a classe org.jboss.security.auth.api.JBossLoginModuleWS é a implementação deste mecanismo de Login. Veja o código-fonte de exemplo:
-
<pre>package org.jboss.security.auth.api;
-
import java.security.acl.Group;
-
import java.util.Map;
-
import javax.security.auth.Subject;
-
import javax.security.auth.Subject;
-
import javax.security.auth.callback.CallbackHandler;
-
import javax.security.auth.login.LoginException;
-
import org.jboss.security.SimpleGroup;
-
import org.jboss.security.SimplePrincipal;
-
import org.jboss.security.auth.spi.UsernamePasswordLoginModule;
-
import org.jboss.security.auth.api.ws.client.*;
-
import org.jboss.security.auth.ws.AutenticateProxy;
-
/**
-
*
-
* @author Edgar Silva
-
*/
-
public class JBossLoginModuleWS extends UsernamePasswordLoginModule {
-
/**
-
* WSDL address
-
*/
-
private String wsdl;
-
public JBossLoginModuleWS() {
-
super();
-
}
-
@Override
-
public void initialize(Subject subject, CallbackHandler callbackHandler,
-
super.initialize(subject, callbackHandler, sharedState, options);
-
log.info("WebServices Login Module : initialize");
-
}
-
@Override
-
return "";
-
}
-
@Override
-
boolean isValid = false;
-
if (inputPassword != null) {
-
try {
-
log.info("Connecting via WS ..............");
-
log.info("UserName: " + getUsername());
-
log.info("Password: "+ inputPassword);
-
p = new AutenticateProxy().autentica(username, inputPassword);
-
log.info("Connected as: " + p.getUsuario());
-
isValid = (p != null);
-
e.printStackTrace();
-
super.setValidateError(e);
-
}
-
}
-
return isValid;
-
}
-
@Override
-
SimpleGroup userRoles = new SimpleGroup("Roles");
-
userRoles.addMember(new SimplePrincipal(p.getGrupo()));
-
return roleSets;
-
}
-
return wsdl;
-
}
-
this.wsdl = wsdl;
-
}
-
}</pre>
Agora, a qualquer momento que você proteger uma Aplicação Web, ou quiser utilizar o Servidor de Aplicações para fazer isto, você deverá configurar o jboss-web.xml para apontar para o LoginModule que voce configurou no login-config.xml, veja o exemplo a seguir:

Além desta configuração, você deverá proteger as páginas de uma Aplicação Web, por exemplo, sendo assim, você irá configurar o web.xml da sua aplicações para pedir o "Realm"(LoginModule) que vc configurou com o nome WSLoginModule, em nosso caso vamos liberar apenas o acesso as páginas .jsp caso o Login seja efetivado no WebServices de autenticação. Veja o web.xml:
Esta é mais uma dica, que sei que posso precisar um dia novamente!


Entries (RSS)
June 19th, 2008 at 2:04 pm
Muito bom Edgar,
Esse dias precisei fazer uma autenticação de um projeto que estava trabalhando e fiz uns testes com o JAAS, achei legal porem nao consegui uma harmonia trabalhando com uma camada Flex para apresentação. Dai decidi trabalhar com o SecurityFilter deu pra quebrar o galho!
[]’s