2 Replies Latest reply on May 4, 2007 3:52 PM by John Blackmore

    SeamLoginModule Error invoking login method

    Michael Robinson Newbie

      I am attempting to write (mostly copy from example s ;) an integration test for a simple login process. I am using Seam 1.2.1.GA, EEJB, hsqldb, etc. The only difference that I can see from the examples is that I am building w/ Maven2...hopefully this is not the issue :( When I execute the test I received the following exception:

      16:21:24,384 - ERROR [SeamLoginModule] Error invoking login method
      org.jboss.seam.InstantiationException: Could not instantiate Seam component: authenticator
       at org.jboss.seam.Component.newInstance(Component.java:1708)
       at org.jboss.seam.Component.getInstance(Component.java:1611)
       at org.jboss.seam.Component.getInstance(Component.java:1578)
       at org.jboss.seam.Component.getInstance(Component.java:1572)
       at org.jboss.seam.jsf.SeamELResolver.getValue(SeamELResolver.java:49)
       at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:135)
       at com.sun.el.parser.AstIdentifier.getValue(AstIdentifier.java:65)
       at com.sun.el.parser.AstValue.getTarget(AstValue.java:62)
       at com.sun.el.parser.AstValue.invoke(AstValue.java:147)
       at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:283)
       at org.jboss.seam.util.UnifiedELMethodBinding.invoke(UnifiedELMethodBinding.java:36)
       at org.jboss.seam.actionparam.ActionParamBindingHelper.invokeTheExpression(ActionParamBindingHelper.java:58)
       at org.jboss.seam.actionparam.ActionParamMethodBinding.invoke(ActionParamMethodBinding.java:75)
       at org.jboss.seam.core.Expressions$2.invoke(Expressions.java:106)
       at org.jboss.seam.security.jaas.SeamLoginModule.login(SeamLoginModule.java:104)
       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:597)
       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$5.run(LoginContext.java:706)
       at java.security.AccessController.doPrivileged(Native Method)
       at javax.security.auth.login.LoginContext.invokeCreatorPriv(LoginContext.java:703)
       at javax.security.auth.login.LoginContext.login(LoginContext.java:575)
       at org.jboss.seam.security.Identity.authenticate(Identity.java:249)
       at org.jboss.seam.security.Identity.authenticate(Identity.java:242)
       at org.jboss.seam.security.Identity.login(Identity.java:172)
       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:597)
       at com.sun.el.parser.AstValue.invoke(AstValue.java:151)
       at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:283)
       at org.jboss.seam.util.UnifiedELMethodBinding.invoke(UnifiedELMethodBinding.java:36)
       at org.jboss.seam.actionparam.ActionParamBindingHelper.invokeTheExpression(ActionParamBindingHelper.java:58)
       at org.jboss.seam.actionparam.ActionParamMethodBinding.invoke(ActionParamMethodBinding.java:75)
       at org.jboss.seam.actionparam.ActionParamBindingHelper.invokeTheExpression(ActionParamBindingHelper.java:58)
       at org.jboss.seam.actionparam.ActionParamMethodBinding.invoke(ActionParamMethodBinding.java:75)
       at org.jboss.seam.mock.SeamTest$Request.invokeMethod(SeamTest.java:401)
       at com.onlineinsight.service.system.security.AuthenticatorTest$1.invokeApplication(AuthenticatorTest.java:25)
       at org.jboss.seam.mock.SeamTest$Request.run(SeamTest.java:489)
       at com.onlineinsight.service.system.security.AuthenticatorTest.testLogin(AuthenticatorTest.java:12)
       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:597)
       at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:552)
       at org.testng.internal.Invoker.invokeMethod(Invoker.java:411)
       at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:785)
       at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:114)
       at org.testng.TestRunner.privateRun(TestRunner.java:693)
       at org.testng.TestRunner.run(TestRunner.java:574)
       at org.testng.SuiteRunner.privateRun(SuiteRunner.java:241)
       at org.testng.SuiteRunner.run(SuiteRunner.java:145)
       at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:901)
       at org.testng.TestNG.runSuitesLocally(TestNG.java:863)
       at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeTestNG(TestNGDirectoryTestSuite.java:195)
       at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:111)
       at org.apache.maven.surefire.Surefire.run(Surefire.java:84)
       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:597)
       at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:244)
       at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:814)
      Caused by: javax.naming.NameNotFoundException: AuthenticatorAction not bound
       at org.jnp.server.NamingServer.getBinding(NamingServer.java:529)
       at org.jnp.server.NamingServer.getBinding(NamingServer.java:537)
       at org.jnp.server.NamingServer.getObject(NamingServer.java:543)
       at org.jnp.server.NamingServer.lookup(NamingServer.java:267)
       at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:626)
       at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:588)
       at javax.naming.InitialContext.lookup(InitialContext.java:392)
       at org.jboss.seam.Component.instantiateSessionBean(Component.java:1075)
       at org.jboss.seam.Component.instantiate(Component.java:1061)
       at org.jboss.seam.Component.newInstance(Component.java:1704)
       ... 65 more
      


      My login method looks like:

      import static org.jboss.seam.ScopeType.SESSION;
      
      import javax.ejb.Stateless;
      import javax.persistence.EntityManager;
      import javax.persistence.NoResultException;
      import javax.persistence.PersistenceContext;
      import javax.persistence.Query;
      
      import org.apache.commons.codec.digest.DigestUtils;
      import org.jboss.seam.annotations.In;
      import org.jboss.seam.annotations.Name;
      import org.jboss.seam.annotations.Out;
      import org.jboss.seam.security.Identity;
      
      @Stateless
      @Name("authenticator")
      public class AuthenticatorAction implements Authenticator {
      
       @PersistenceContext
       private EntityManager entityManager;
      
       // user attempting to login
       @Out(required = false, scope = SESSION)
       private User currentUser;
      
       // built in seam security component
       @In(required = false)
       private Identity identity;
      
       /**
       * Authenticate the user
       *
       * @return boolean true if the user is authenticated, false otherwise
       */
       public boolean authenticate() {
       try {
       // query by username
       Query query = this.entityManager.createQuery("select u from User u where u.username= :username").setParameter("username", identity.getUsername());
       User user = (User) query.getSingleResult();
      
       // compare the passwords
       if (!this.compareHash(user.getHashedPassword(), this.identity.getPassword())) {
       return false;
       }
      
       this.currentUser = user;
      
       // populate built in security object with user roles
       for (UserRole userRoles : this.currentUser.getRoles()) {
       this.identity.addRole(userRoles.getName());
       }
      
       return true;
       } catch (NoResultException ex) {
       return false;
       }
       }
      
       /**
       * Compares a hash with a string value
       *
       * @param hash the hase value
       * @param password the string value
       * @return true if the value of the string hased equals the orignal hash value
       */
       private boolean compareHash(String hash, String password) {
       if (hash == null || password == null) {
       return false;
       }
      
       // compute the hash of the sting value
       String newHash = DigestUtils.md5Hex(password);
       if (newHash == null) {
       return false;
       }
      
       // compare
       return hash.equalsIgnoreCase(newHash);
       }
      
      }
      


      My components.xml is:

      <?xml version="1.0" encoding="UTF-8"?>
      <components xmlns="http://jboss.com/products/seam/components"
       xmlns:core="http://jboss.com/products/seam/core"
       xmlns:security="http://jboss.com/products/seam/security"
       xmlns:theme="http://jboss.com/products/seam/theme"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation=
       "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-1.2.xsd
       http://jboss.com/products/seam/components http://jboss.com/products/seam/components-1.2.xsd
       http://jboss.com/products/seam/drools http://jboss.com/products/seam/drools-1.2.xsd
       http://jboss.com/products/seam/security http://jboss.com/products/seam/security-1.2.xsd">
      
       <core:init jndi-pattern="@jndiPattern@" my-faces-lifecycle-bug="true" debug="true"/>
      
      
       <core:ejb installed="@embeddedEjb@"/>
      
       <core:manager conversation-timeout="120000"
       concurrent-request-timeout="500"
       conversation-id-parameter="cid"
       conversation-is-long-running-parameter="clr"/>
      
       <core:entity-manager-factory name="test-persistence-unit"/>
      
       <core:managed-persistence-context name="ems"
       auto-create="true"
       entity-manager-factory="#{test-persistence-unit}"/>
      
       <!-- seam event listener -->
       <core:transactionListener/>
      
       <!-- seam security for authentication -->
       <security:identity authenticate-method="#{authenticator.authenticate}"/>
      
       <!-- delcare themes below -->
       <theme:theme-selector cookie-enabled="true">
       <theme:available-themes>
       <value>default</value>
       </theme:available-themes>
       </theme:theme-selector>
      
       <!-- redirect to the originally requested view -->
       <event type="org.jboss.seam.notLoggedIn">
       <action expression="#{redirect.captureCurrentView}"/>
       </event>
       <event type="org.jboss.seam.postAuthenticate">
       <action expression="#{redirect.returnToCapturedView}"/>
       </event>
      </components>
      


      And finally my stripped down integration test (i can't get past the first invokeMethod):

      import org.jboss.seam.mock.SeamTest;
      import org.testng.annotations.Test;
      
      public class AuthenticatorTest extends SeamTest {
      
      
       @Test(groups = "integration")
       public void testLogin() throws Exception {
      
       new FacesRequest() {
      
       @Override
       protected void updateModelValues() throws Exception
       {
       assert !isSessionInvalid();
       setValue("#{identity.username}", "test");
       setValue("#{identity.password}", "test");
       }
      
       @Override
       protected void invokeApplication()
       {
       assert (Boolean) invokeMethod("#{identity.login}");
       }
      
       }.run();
       }
       }
      


      I didn't include the complete stack trace b/c it is quite long... but I can if it would help!

      Thanks,

      Michael

        • 1. Re: SeamLoginModule Error invoking login method
          Maarten Haubrich Newbie

          Hi,

          I am having exactly the same problem and I haven't been able to make any progress for quite some time now.
          Any help would be greatly appreciated!

          Maarten

          • 2. Re: SeamLoginModule Error invoking login method
            John Blackmore Newbie

            I've been struggling with this problem all day, and I just figured out what my problem was. Maybe yours is the same.

            I too started with the examples, specifically booking. In my case, I had been checking the differences between my log output and the booking example test output, and the key difference was that my entity manager and datasource were never deployed. I spent some time on that, and I was on the right track.

            Check your jboss-beans.xml file, in META-INF. When running in the container, it seemed okay to leave this blank (or rather, with empty deployment tag). In the eejb/microcontainer environment, I needed some kind of datasource bootstrap, like in booking/resources/META-INF/jboss-beans.xml. Then of course I needed an import.sql to load the data I needed for the test(s), since I'm no longer connecting to Oracle.

            That did the trick for me. Hope this helps.

            John