Hi, gurus.
My question is about authentication data propagation from servlet to EJB.
We use one security domain for our application based on custom LoginModule.
The only security config in our web.xml is

  |     <security-constraint>
  |       <web-resource-collection>
  |          <web-resource-name>
  |             The Protected Calculator
  |          </web-resource-name>
  |          <url-pattern>*.jsf</url-pattern>
  |       </web-resource-collection>
  | 
  |       <user-data-constraint>
  |          <transport-guarantee>NONE</transport-guarantee>
  |       </user-data-constraint>
  |    </security-constraint>
  | 
It seemed it doesn't matter cause we don't use any Tomcat provided ways of 
servlet authentication (cause our login logic is more complex). 
So in one JSF action method I interact with LoginContext directly:

  |     public String login() {
  |         String outcome = Constants.FAILED;
  |         try {
  |             IdmCallbackHandler callbackHandler = new 
IdmCallbackHandler(getLoginName(), getPassword(), getAccountId());
  |             loginContext = new 
LoginContext(AuthenticationBean.SECURITY_REALM, callbackHandler);
  |             loginContext.login();
  |             Subject subject = loginContext.getSubject(); 
  |              
getFacesContext().getExternalContext().getSessionMap().put(Constants.SUBJECT_SESSION_KEY,
 subject);
  | 
  |             for(Principal p : subject.getPrincipals()) {
  |                 if (p instanceof IdmPrincipal) {
  |                     setCurrentUserAccount( new UserAccount( 
((IdmPrincipal)p).getAccount() ) );
  |                     break;
  |                 }
  |             }
  | 
login() passes successfully and subject is valid
The problem occurs inside setCurrentUserAccount() when local stateless session 
bean method (marked with @PermitAll) is called:
18:05:21,943 ERROR [AuthenticationBean] Exception: 
javax.ejb.EJBAccessException: Authentication failure
        at 
org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.handleGeneralSecurityException(Ejb3AuthenticationInterceptor.java:70)
        at 
org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:70)
        at 
org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
        at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
        at 
org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
        at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
        at 
org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
        at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
        at 
org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:211)
        at 
org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:79)
        at $Proxy4155.getPermissions(Unknown Source)
        at 
com.image.idm.jsf.beans.UserAccount.loadPermissions(UserAccount.java:51)
        at com.image.idm.jsf.beans.UserAccount.setAccount(UserAccount.java:47)
        at com.image.idm.jsf.beans.UserAccount.(UserAccount.java:36)
        at 
com.image.idm.jsf.beans.AuthenticationBean.login(AuthenticationBean.java:140)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at com.sun.el.parser.AstValue.invoke(AstValue.java:151)
        at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:283)
        at 
com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
        at 
com.sun.facelets.el.LegacyMethodBinding.invoke(LegacyMethodBinding.java:69)
        at 
org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:63)
        at javax.faces.component.UICommand.broadcast(UICommand.java:106)
        at 
org.ajax4jsf.framework.ajax.AjaxViewRoot.processEvents(AjaxViewRoot.java:281)
        at 
org.ajax4jsf.framework.ajax.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:257)
        at 
org.ajax4jsf.framework.ajax.AjaxViewRoot.processApplication(AjaxViewRoot.java:412)
        at 
org.apache.myfaces.lifecycle.LifecycleImpl.invokeApplication(LifecycleImpl.java:343)
        at 
org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:86)
Caused by: com.image.idm.jaas.IdmLoginException
        at com.image.idm.jaas.IdmLoginModule.login(IdmLoginModule.java:110)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at javax.security.auth.login.LoginContext.invoke(LoginContext.java:769)
        at 
javax.security.auth.login.LoginContext.access$000(LoginContext.java:186)
        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:683)
        at 
javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
        at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
        at 
org.jboss.security.plugins.JaasSecurityManager.defaultLogin(JaasSecurityManager.java:601)
        at 
org.jboss.security.plugins.JaasSecurityManager.authenticate(JaasSecurityManager.java:535)
        at 
org.jboss.security.plugins.JaasSecurityManager.isValid(JaasSecurityManager.java:344)
        at 
org.jboss.aspects.security.AuthenticationInterceptor.authenticate(AuthenticationInterceptor.java:123)
        at 
org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:66)
        at 
org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:102)
        at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
        at 
org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:47)
        at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
        at 
org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
        at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
        at 
org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:211)
        at 
org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:79)
        at $Proxy4155.getPermissions(Unknown Source)
        at 
com.image.idm.jsf.beans.UserAccount.loadPermissions(UserAccount.java:51)
        at com.image.idm.jsf.beans.UserAccount.setAccount(UserAccount.java:47)
        at com.image.idm.jsf.beans.UserAccount.(UserAccount.java:36)
        at 
com.image.idm.jsf.beans.AuthenticationBean.login(AuthenticationBean.java:140)


 It seemed that during EJB method invokation our LoginModule is called again. 
Is it really needed or it is a wrong behaviour? 
Is it possible to make EJB container "undestand" that authentication is done 
and take authentication info? 
Both jboss.xml and jboss-web.xml are configured to the same security domain.
JBOSS version is 4.0.5 GA.

If you know the decision or at least the root of the problem - please let me 
know

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4027967#4027967

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4027967
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to