Fala galera blz?
Seguinte, estou querendo implementar uma autenticação via JAAS no meu EJB3 e para prover esta autenticação eu já tenho algum contato pois já mexi anteriormente com ela para fazer pro meu Web Services. No meu Bean eu coloquei a anotação @SecurityDomain(“minhaApplicationPolicy”) e esta está referenciando um bloco “application-policy” que inseri no arquivo login-config.xml do JBoss que está em $JBOSS_HOME/server/default/conf. Por sua vez este bloco application-policy referencia a minha classe de autenticação e esta classe está extendendo a Classe DatabaseServerLoginModule sendo que esta última já extende a UsernamePasswordLoginModule. Nesta minha classe sobrescrevo os métodos getUsersPassword() e getRoleSets(). Ate aí tudo beleza, a parte server desta arquitetura está funcionando perfeitamente para o meu Web Service. Porém quando eu preciso que uma aplicação client, um Sistema Web por exemplo, se autentique neste modelo, não estou conseguindo. Andei dando uma boa pesquisada na net sobre clients para JAAS e talz e não achei algum que me ajudasse muito neste conceito. O que eu achei foi algumas properties a mais para usar na hora de realizar o lookup do meu Bean no JNDI. Segue as properties:
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
props.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5");
props.put(Context.SECURITY_PRINCIPAL, "username");
props.put(Context.SECURITY_CREDENTIALS, "password");
props.put("java.naming.security.sasl.realm", "domainXXX");
Os valores passados nelas chegam no meu método getUsersPassword() exceto o valor do domain da aplicação. O mesmo jeito que uso para resgatar o realm(domain) via Web Service não está funcionando para resgatar o domain que está na property. Estou tentanto pegá-lo usando:
String domain = null;
MapCallback mc = new MapCallback();
Callback[] callbacks = {mc};
try
{
callbackHandler.handle(callbacks);
} catch(Exception e)
{
throw new LoginException(e.getMessage());
}
domain = mc.getInfo(RFC2617Digest.REALM).toString();
if(domain.indexOf(':') >= 0)
domain = domain.substring(0, domain.indexOf(':'));
return domain;
Se eu passo o domain manualmente a PrincipalsQuery é realizada com sucesso, a senha que está armazenada no banco volta sem problemas, porém no final ele acaba nao autenticando e dando a seguinte exception:
20:39:04,859 ERROR [STDERR] javax.ejb.EJBAccessException: Authentication failure
20:39:04,859 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.handleGeneralSecurityException(Ejb3AuthenticationInterceptor.java:68)
20:39:04,859 ERROR [STDERR] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:70)
20:39:04,859 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
20:39:04,859 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
20:39:04,859 ERROR [STDERR] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
20:39:04,859 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
20:39:04,859 ERROR [STDERR] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
20:39:04,859 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
20:39:04,859 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessContainer.dynamicInvoke(StatelessContainer.java:304)
20:39:04,859 ERROR [STDERR] at org.jboss.ejb3.remoting.IsLocalInterceptor.invokeLocal(IsLocalInterceptor.java:81)
20:39:04,859 ERROR [STDERR] at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)
20:39:04,859 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
20:39:04,859 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:107)
20:39:04,859 ERROR [STDERR] at $Proxy171.find(Unknown Source)
20:39:04,859 ERROR [STDERR] at br.com.voicetechnology.ng.ipx.businessdelegate.implement.WCADelegateImp.find(WCADelegateImp.java:50)
20:39:04,859 ERROR [STDERR] at br.com.voicetechnology.ipx.web.wca.actions.services.news.NewsAction.findWebImp(NewsAction.java:151)
20:39:04,859 ERROR [STDERR] at br.com.voicetechnology.ipx.web.wcc.commons.actions.RequestAction.findWeb(RequestAction.java:231)
20:39:04,859 ERROR [STDERR] at br.com.voicetechnology.ipx.web.wca.actions.services.news.NewsAction.getNews(NewsAction.java:117)
20:39:04,859 ERROR [STDERR] at br.com.voicetechnology.ipx.web.WCCRequestFacade.homeRefresh(WCCRequestFacade.java:348)
20:39:04,859 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
20:39:04,875 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
20:39:04,875 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
20:39:04,875 ERROR [STDERR] at java.lang.reflect.Method.invoke(Unknown Source)
20:39:04,875 ERROR [STDERR] at uk.ltd.getahead.dwr.impl.ExecuteQuery.execute(ExecuteQuery.java:239)
20:39:04,875 ERROR [STDERR] at uk.ltd.getahead.dwr.impl.DefaultExecProcessor.handle(DefaultExecProcessor.java:48)
20:39:04,875 ERROR [STDERR] at uk.ltd.getahead.dwr.impl.DefaultProcessor.handle(DefaultProcessor.java:81)
20:39:04,875 ERROR [STDERR] at uk.ltd.getahead.dwr.AbstractDWRServlet.doPost(AbstractDWRServlet.java:162)
20:39:04,875 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
20:39:04,875 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:39:04,875 ERROR [STDERR] at br.com.voicetechnology.ng.ipx.commons.web.SetEncodingRequestFilter.doFilter(SetEncodingRequestFilter.java:25)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:39:04,875 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
20:39:04,875 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
20:39:04,875 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
20:39:04,875 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
20:39:04,875 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
20:39:04,875 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
20:39:04,875 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
20:39:04,875 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
20:39:04,875 ERROR [STDERR] at java.lang.Thread.run(Unknown Source)
Será que existe um meio mais fácil de prover um client para autenticar no meu SessionBean via JAAS? Ou então voces tem alguma idéia do que falta implementar neste meu modelo???
Estou usando BusinessDelegate e ele chama o ServiceLocator para realizar o lookup do meu bean na JNDI e assim resgatar estas properties configuradas.
OBS: Sei que falei de muitas coisas de uma vez só, então se voces quiserem q eu explique com mais detalhes alguma parte, é só mandar o post 8)
Agradeço muito se voces puderem me ajudar com este problema. Se voces souberem de algum tutorial bom sobre como implementar um Client usando mais ou menos esse modelo já ajuda bastante
Leonardo Nickel