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:
Screenshot-*login-config.xml (-opt-java-jboss-as-jboss-4.2.2.GA-server-dev-conf) - gedit.png

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:

JAVA:
  1. <pre>package org.jboss.security.auth.api;
  2. import java.security.acl.Group;
  3. import java.util.Map;
  4. import javax.security.auth.Subject;
  5. import javax.security.auth.Subject;
  6. import javax.security.auth.callback.CallbackHandler;
  7. import javax.security.auth.login.LoginException;
  8. import org.jboss.security.SimpleGroup;
  9. import org.jboss.security.SimplePrincipal;
  10. import org.jboss.security.auth.spi.UsernamePasswordLoginModule;
  11. import org.jboss.security.auth.api.ws.client.*;
  12. import org.jboss.security.auth.ws.AutenticateProxy;
  13. /**
  14. *
  15. * @author Edgar Silva
  16. */
  17. public class JBossLoginModuleWS extends UsernamePasswordLoginModule {
  18. /**
  19. * WSDL address
  20. */
  21. private String wsdl;
  22. protected org.jboss.security.auth.ws.Principal p;
  23. public JBossLoginModuleWS() {
  24. super();
  25. }
  26. @Override
  27. public void initialize(Subject subject, CallbackHandler callbackHandler,
  28. Map sharedState, Map options) {
  29. super.initialize(subject, callbackHandler, sharedState, options);
  30. log.info("WebServices Login Module : initialize");
  31. }
  32. @Override
  33. protected String getUsersPassword() throws LoginException {
  34. return "";
  35. }
  36. @Override
  37. protected boolean validatePassword(String inputPassword, String expectedPassword) {
  38. boolean isValid = false;
  39. if (inputPassword != null) {
  40. try {
  41. log.info("Connecting via WS ..............");
  42. String username = getUsername();
  43. log.info("UserName: " + getUsername());
  44. log.info("Password: "+ inputPassword);
  45. p = new AutenticateProxy().autentica(username, inputPassword);
  46. log.info("Connected as: " + p.getUsuario());
  47. isValid = (p != null);
  48. } catch (Throwable e) {
  49. e.printStackTrace();
  50. super.setValidateError(e);
  51. }
  52. }
  53. return isValid;
  54. }
  55. @Override
  56. protected Group[] getRoleSets() throws LoginException {
  57. SimpleGroup userRoles = new SimpleGroup("Roles");
  58. userRoles.addMember(new SimplePrincipal(p.getGrupo()));
  59. Group[] roleSets = {userRoles};
  60. return roleSets;
  61. }
  62. public String getWsdl() {
  63. return wsdl;
  64. }
  65. public void setWsdl(String wsdl) {
  66. this.wsdl = wsdl;
  67. }
  68. }</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:
jboss-web.xml

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:

web.xml

Esta é mais uma dica, que sei que posso precisar um dia novamente!

[]s
E

One Response to “Criando um Novo LoginModule JAAS no JBoss”

  1. Anderson Silveira says:

    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

Leave a Reply