Configurando Single Sign On (SSO) no JBoss AS 7.1.1

Postado em Atualizado em

Para quem não sabe quem é o japa ai em cima, ele é o chaveiro de Matrix Reloaded. Ele tinha o poder de abrir todas as portas. Similarmente o JBoss nos fornece a possibilidade de utilizar algo similar ao chaveiro: o JBoss SSO.

O JBoss SSO permite propagar contextos de segurança e informações de identidade entre aplicações Web, EJBs, Web Services entre outros, ou seja você pode utilizar o mesmo login em aplicações diferentes.
O JBoss AS 7 ofereçe algumas soluções de SSO e deve ser utilizado conforme a sua necessidade. Veja abaixo alguma das alternativas:

  •   Kerberos-Based Desktop SSO
  •   Non-Clustered e Web Application SSO
  •   Clustered Web Application SSO
  •   Web Application SSO Among Non-Clustered Servers
  •   SSO with EJB Applications or Web Services on Multiple Servers

Nesse post nós vamos configurar utilizar a solução Non-Clustered e Web Application SSO. Se você precisa propagar informações de segurança entre as aplicações que rodam dentro do mesmo grupo de servidores ou instância, você pode usar non cluster SSO. Isso só envolve a configuração da válvula no descritor no arquivo jboss-web.xml.

Então vamos lá.

O primeiro passo é configurar um dominio de segurança que pode ser baseado em banco de dados, arquivos e por ai vai. Nesse post vou utilizar um dominio de segurança baseado em arquivos pois são os mais comuns.

No arquivo JBOSS_HOME/standalone/configuration/standalone-full.xml o dominio de segurança “mytest” deve ser configurado:

 <subsystem xmlns="urn:jboss:domain:security:1.1">
   <security-domains>
	<security-domain name="mytest" cache-type="default">
	    <authentication>
		<login-module code="UsersRoles" flag="required">
		    <module-option name="usersProperties" value="${jboss.server.config.dir}/users.properties"/>
		    <module-option name="rolesProperties" value="${jboss.server.config.dir}/roles.properties"/>
		</login-module>
	    </authentication>
	</security-domain>
   </security-domains>
</subsystem>

Crie também os arquivos users.properties e roles.properties adicione o usuário, senha e roles, veja abaixo:

users.properties
admin=123456

roles.properties
admin=Manager

Agora para os testes eu criei duas aplicações web bem simples. A duas precisam ter a válvula SSO configurada no jboss-web.xml como abaixo:

<jboss-web>
	<security-domain>mytest</security-domain>
	<valve>
		<class-name>org.apache.catalina.authenticator.SingleSignOn</class-name>
		<param>
			<param-name>maxEmptyLife</param-name>
			<param-value>900</param-value>
		</param>
	</valve>
</jboss-web>

No web.xml das aplicações adicione também as configurações de login, veja abaixo:

  <security-constraint>
  <web-resource-collection>
    <web-resource-name>HtmlAuth</web-resource-name>
    <description>application security constraints
    </description>
    <url-pattern>/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
    <role-name>Manager</role-name>
  </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Test SSO</realm-name>
</login-config>
<security-role>
    <role-name>Manager</role-name>
</security-role>

As aplicações criadas foram as AdministrativoSSO.war e FinanceiroSSO.war. Para realizar os teste é bem simples faça o deploy das duas aplicações no JBoss 7 vá até o browser e realize login em uma das aplicações ao tentar acessar a outra aplicação você ja deverá estar logado.

Se a sessão for invalidada em uma das aplicações todas as aplicações realizarão logout. Para invalidar a sessão execute programaticamente: javax.servlet.http.HttpSession.invalidate().

Vou deixar aqui os arquivos utilizados nesses testes.

Espero que tenha ajudado, Abraços

18 comentários em “Configurando Single Sign On (SSO) no JBoss AS 7.1.1

    Mauricio disse:
    18 de junho de 2012 às 20:00

    Primeiramente, parabéns pelo post! Em segundo lugar, preciso de uma ajuda… se faço a configuração conforme seu exemplo, funciona tudo corretamente, porém, se troco o método de autenticação no web.xml de BASIC para FORM, as minhas aplicações não compartilham o usuário autenticado… alguma idéia do que pode estar ocorrendo?

    Mauricio Magnani respondido:
    19 de junho de 2012 às 10:43

    Bom eu realmente já vi esse problema mas até agora não consegui entender por que não funciona… deveria funcionar… eu vou fazer mais alguns testes e se funcionar eu volto para completar esse post…

    Abraços

    Leonardo disse:
    13 de agosto de 2012 às 11:56

    Bom dia pessoal! Conseguiram encontrar alguma solução? Acredito que teremos que utilizar um custom para solucionar.

      Mauricio Magnani respondido:
      14 de agosto de 2012 às 0:39

      Eu realmente não pesquisei e nem tentei mas fazer isso…:/
      Mas se achar alguma solução eu posto aqui…

      Abs

    Antonio Filho (@Antonio_Filho) disse:
    30 de janeiro de 2013 às 19:59

    Olá Mauricio e Leonardo estava com problema similar, consegui resolver alterando a configuração do domain sso de “localhost” para “127.0.0.1” no standalone.xml:

    realizei o teste acessando minhas aplicações(wars) pelo loopback http://127.0.0.1:8080 e funcionou corretamente!

    Abs!

    Joander disse:
    7 de março de 2013 às 18:50

    Boa Tarde, não consegui fazer funcionar,
    existe um standalone-full.xml e standalone-full-ha.xml qual a diferença entre eles ? eu coloquei o codigo tanto em um quanto em outro mas não deu certo, da o seguinte erro :
    New missing/unsatisfied dependencies:
    service jboss.security.security-domain.mytest(missing) dependents: [service jboss.web.deployment.default-host./neighbor.realm]

    parareçe que ele não consegue encontrar o security-domain.
    se eu usar o mesmo security-domain no standalone.xml da certo !

    Tem como manda este seu projeto de exemplo ?

      Mauricio Magnani Jr respondido:
      7 de março de 2013 às 21:41

      E ai Joander blz?
      Cara eu nao tenho mais essas aplicações eu delei meu site no google e sem querer acabei perdendo!
      Acho que vc está fazendo uma pequeno confusão… se voce está usando o standalone-full.xml na inicialização voce deve utilizar o seguinte parametro:

      Linux: JBOSS_HOME/bin/standalone.sh -c standalone-full.xml
      Windows: JBOSS_HOME\bin\standalone.bat -c standalone-full.xml

      Verificar se funciona agora!!

      A diferença entre eles são os recursos disponiveis!
      Dá uma olhada nesse post: https://jbossdivers.wordpress.com/2012/12/21/java-ee-6-web-profile-e-full-profile-no-jboss-as-7-jboss-eap-6/

      Abs

        Joander disse:
        8 de março de 2013 às 10:03

        Valeu amigo, agora deu certinho, estava configurando no standalone-full.xml e iniciando no standalone.xml por isso não encontrava o security-domain.
        No eclipse é só especificar com qual arquivo de configuração iniciar🙂

        Mauricio Magnani Jr respondido:
        8 de março de 2013 às 10:49

        Legal🙂

        Sempre que precisar é só dizer!!!

        Abs

    Luciano disse:
    12 de junho de 2013 às 11:22

    O JBOSS SSO, se integra também em outras linguagens como PHP ? Caso eu tiver aplicações em php e j2ee.

    Luciano disse:
    12 de junho de 2013 às 13:57

    Dei uma olhada no link, mais me parece que o jboss sso não se da muito bem com integração a outras linguagens, mais não cheguei a testar. Estou dando uma olhada em uma outra ferramenta de SSO o JOSSO, a documentação é muito boa, e aceita varias linguagens, vou realizar alguns testes.

    Valeu, abs!

      Mauricio Magnani Jr respondido:
      12 de junho de 2013 às 14:01

      É acredito que o JBoss SSO não funcione mesmo com o PHP:/

      o JOSSO é uma boa opção😉

      Abs

        Luciano disse:
        12 de junho de 2013 às 14:12

        Também estou dando uma olhada nesse JBoss Federated SSO(http://www.jboss.org/jbosssso), vou ver se a implementação é parecido com o post.
        Valeu!

    Robson disse:
    25 de junho de 2013 às 12:05

    Mauricio Magnani Jr

    Segui seu exemplo e que por sinal achei muito interessante, mas quando entro na aplicação ele me solicita um usuário e senha antes mesmo de chegar na tela de login.
    minha aplicação valida usuário no AD, eu coloco as credenciais do AD mas da a mensagem “Login failure: javax.security.auth.login.FailedLoginException: Password Incorrect/Password Required”

      Mauricio Magnani Jr respondido:
      25 de junho de 2013 às 21:35

      Oi Robson,

      Respondi vc no tutorial de LDAP… o erro é na senha armazenada no AD… me mostra seu arquivos de configuração ai posso te ajudar!

      Abs

    Robson disse:
    26 de junho de 2013 às 8:45

    Mauricio Magnani Jr

    irei postar meu standalone.xml completo.

    jdbc:mysql://localhost:3306/catalina
    mysql

    usuario
    senha

    100
    true

    jdbc:oracle:thin:@SERVER:1521:XXXXXXX
    oracle

    usuario
    senha

    jdbc:oracle:thin:@SERVER:1521:XXXXXXX
    oracle

    usuario
    senha

    oracle.jdbc.driver.OracleDriver
    oracle.jdbc.xa.client.OracleXADataSource

    com.mysql.jdbc.jdbc2.optional.MysqlXADataSource

    1

    true
    ${jboss.bind.address:127.0.0.1}

                        
                    

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s