GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

jdbcRealm no Glassfish 3.1.1


#1

Alguém já conseguiu fazer o jdbcRealm funcionar no glassfish 3.1.1? Eu estou faz uns 2 dias tentando fazer funcionar porém sempre dá o seguinte erro:

com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Failed file login for humberto.
	at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:394)
	at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:240)
	at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:153)
	at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:512)
	at com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:453)
	at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:268)
	at org.apache.catalina.authenticator.AuthenticatorBase.processSecurityCheck(AuthenticatorBase.java:911)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:546)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:623)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)

Aparentemente o glassfish está utilizando o fileRealm ao invés do jdbc. Já pesquisei no google e achei muitos casos similares, mas nenhuma solução que resolvesse o meu problema.

Estou utilizando o postgreSQL (também testei com o javadb) e as minhas configurações estão abaixo:

web.xml:

    <security-constraint>
        <display-name>UserConstraint</display-name>
        <web-resource-collection>
            <web-resource-name>usuario</web-resource-name>
            <description/>
            <url-pattern>/index.xhtml</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>usuario</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>security</realm-name>
        <form-login-config>
            <form-login-page>/login.xhtml</form-login-page>
            <form-error-page>/loginError.xhtml</form-error-page>
        </form-login-config>
    </login-config>
    <security-role>
        <description/>
        <role-name>usuario</role-name>
    </security-role>

glassfish-web.xml:

  <security-role-mapping>
    <role-name>usuario</role-name>
    <principal-name>humberto</principal-name>
    <group-name>usuario</group-name>
  </security-role-mapping>

domain.xml (glassfish):

    <auth-realm name="security" classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm">
          <property name="jaas-context" value="jdbcRealm"></property>
          <property description="null" name="password-column" value="password"></property>
          <property name="assign-groups" value="usuario"></property>
          <property name="datasource-jndi" value="jdbc/security"></property>
          <property name="group-table" value="usuario"></property>
          <property name="user-table" value="usuario"></property>
          <property description="null" name="group-name-column" value="group"></property>
          <property name="digest-algorithm" value="none"></property>
          <property description="null" name="user-name-column" value="username"></property>
    </auth-realm>

No glassfish 3.0.1 eu já consegui fazer funcionar com essas mesmas configurações.

Basicamente já tentei utilizando MD5 ou none para encriptação, usuario e grupo como tabelas separadas, grupo como um atributo de usuário (portanto utilizando apenas 1 tabela), usando view, e nada disso funcionou comigo.

O jdbc pool está corretamente configurado, pois já o utilizei dentro da aplicação (EJB3+JSF2).

Eu criei este tópico não apenas para achar a solução, mas para talvez me convencer de que isso realmente não é possível devido a um bug dessa versão do glassfish.


#2

Estou no mesmo dilema.

Fiquei revendo a configuração o dia inteiro ontem, e não funcionava nem a pau. Tentei no glasfish 3.0 e funcionou normal.

Alguém conseguiu configurar o JDBCRealm com Glassfish 3.1?

Abraços.


#3

Testei no 3.1.1 e no 3.1 e nada. No 3.0.1 funcionou certo.

Ou é um bug ou mudou a forma de fazer a configuração.

Se alguém souber....


#4

Pois é, também me passou pela cabeça que poderia ter mudado a configuração, porém na documentação oficial e nos tutoriais que vi, configuram tudo do mesmo jeito. Estou torcendo para isso estar resolvido no glassfish 3.2. Por enquanto vou desenvolvendo a aplicação no 3.1.1, mais pra frente decido se uso o 3.2 ou 0 3.0 para utilizar o jdbcRealm.

Ou testo o JBoss AS 7 na próxima release do Netbeans tb, pois no pouco que mexi com o glassfish ele me pareceu meio instável.

No 3.0.1 por algum motivo ele demora uma eternidade para abrir o admin console, achei que fosse por causa do proxy da rede, mas desabilitei o acesso à internet e continuou a mesma coisa. No 3.1.1 abre normal, mas tem esse problema do realm. Complicado...


#5

Olá pessoal,

eu também fui implementar no GF 3.1.1 (b12) e realmente parece ser BUG do glassfish. Estou acompanhando blogs que relatam o mesmo problema. Penso que o que podemos fazer é esperar atualização.

Se tiver alguma novidade postarei aqui, e peço que postem, pois acredito que muitos estão com o mesmo problema.

Abraços.


#6

Bom, alguns resolveram o problema voltando para versão 3.0.

No entanto, são vários problemas ao fazer downgrade para 3.0. Primeiro que esta versão não possui cobertura completa para JEE 6 e parece que tem bugs com CDI.

Alguem no GUJ está conseguindo usar JDBC Realm com GF 3.1.1??


#7

Bom, só para situar quem acompanha este tópico ou está passando por mesmo problema.

Entrei em contato por MP com dois colegas que postaram aqui e ambos resolveram voltando a versão do GF para 3.0x. Como disse acima, em algumas situações isso não dá (como no eu caso). Estou postando em outros foruns como Javaranch e Stackoverlfow.

Assim que tiver novidades, eu postarei aqui. Mas a princípio, parece realmente ser BUG do GF 3.1.1.

Abraço.


#8

Pessoal, consegui resolver. Irei deixar os procedimentos e dicas para aqueles que estiverem passando por mesmo problema, resolverem.

1 - A criptografia padrão do GF 3.1.x, diferente das versões anteriores que é MD5, é SHA-256. Por tanto, a senha gravada no Banco deve estar neste formato.
2 - Altere o Level do Log de segurança para FINEST. Assim voce conseguirá detectar mais detelhadamente os erros. O padrão que é INFO irá te retornar coisa mais generica e dificil de detectar.
3 - Se possível, atualize o Java para 7 (Isso não é requerimento para funcionar)

Depois que segui esses passos, eu fiquei mais confuso ainda. O que estava acontecendo comigo era o seguinte: dava essa Exception:

WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception

Como podem ver, é um erro generico. Ativei o level de Log e eis que me deparo com este erro:

Column "userpassword" does not exists

Mas a coluna estava lá dentro da tabela user, foi como se o Glassfish não estivesse "enxergando" (bug??).

Depois de bater a cabeça por mais umas horas, resolvi recriar a tabela de Usuarios. Coloquei assim só para teste:

tabela: usuario
name: nome
password: senha

Inseri os mesmos dados que haviam na tabela anterior. E reconfigurei o mesmo Realm, alterando os nomes dos campos.

E pasmem. Funcionou. Realmente nao entendi o que pode ter acontecido, só sei que isso tirou meu sono por 4 dias.

Abraços.


#9

Eu tenho usado o GF3.1.1, e meu JDBC Realm está funcionando bem.

Segue meu arquivo de configuração. Dados do usário e grupo estão na mesma tabela, e uso um datasource para conectar na base de dados.

<auth-realm name="icob-jaas-realm" classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm">
    <property name="digest-algorithm" value="SHA-256"></property>
    <property name="user-name-column" value="email"></property>
    <property name="password-column" value="passwd"></property>
    <property name="group-name-column" value="usergroup"></property>
    <property name="jaas-context" value="jdbcRealm"></property>
    <property name="group-table" value="authuser"></property>
    <property name="user-table" value="authuser"></property>
    <property name="datasource-jndi" value="jdbc/icobDS"></property>
</auth-realm>

#10

Pessoal,

Estou com um problema bem pareceido com o de vocês, porém estou usando glassfish v.3.0.1.
As configurações com Realm estão corretas e aplicação, a principio estão corretas. Porém quando digito login e senha (baseado em FORM) o glassfish apresenta o seguinte erro:

GRAVE: SEC1112: Cannot validate user [teste] for JDBC realm.  
AVISO: Web login failed: Login failed: javax.security.auth.login.LoginException: Security Exception

Parece ser algum problema com o acesso ao banco de dados, mas o mapeamento (na minha visão) está ok.
O meu banco possui várias tabelas, mas as que são necessarias para a validação são as seguintes:

-------------------------------------------
                  usuario                             
-------------------------------------------
iduser: Long (PK)
...
loginuser: character varying(50)
senhauser: character varying(50)
...
idgrupo: Long (FK)
-------------------------------------------

e

-------------------------------------------
              grupousuario                             
-------------------------------------------
idgrupo: Long (PK)
nomegrupo: character varying(50) 
-------------------------------------------

e as configurações de realm no glassfish são estas:

Nome da classe: com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm
Contexto do JAAS: jdbcRealm
JNDI: DB2Saude
Tabela de usuários: usuario
Coluna de nomes de usuários: loginuser
Coluna de senhas: senhauser
Tabela de grupos: grupousuario
Coluna de nomes de grupos: nomegrupo

Onde posso estar errando?
Por favor, ajudem-me!


#11

Boa tarde amigos,

Comigo tah dando essa zica tambem. =/

Alguém, por gentileza, sabe me dizer se existe alguma restrição (bug) referente à versão do glassfish. Jah ate plantei babaneira aqui e nada. =)

[]'s


#12

Realmente, no BD, a senha estava sem o MD5, eu coloquei e, ao menos, mudou o erro:

[]'s


#13

Posta a sua configuração, aparentemente esse erro é mais tranquilo para resolver.


#14

Opa,

Deixa eu soh me situar aqui e jah posto o problema.
[]'s


#15