hibernate - loginId not passed to UserDetailsService for spring security -


in spring security, using class customuserdetailsservice implements userdetailsservice , method public userdetails loaduserbyusername(string email) <input id="j_username" type="text" placeholder="log-in id"/> email (as login id) not passed loaduserbyusername(). meant blank "" if give text. can reasons of it?


chrome shift + ctrl + i

enter image description here


parameter username of loaduserbyusername in custom userdetailsservice empty similar, not relevant guess?


some main important error logs.

the email passed customuserdetailsservice in method loaduserbyusername is:  debug ---- 1 email entered lookup :  debug --- debug --- b hibernate: select users0_.id id1_15_, users0_.description descript2_15_, users0_.email email3_15_, users0_.isenabled isenable4_15_, users0_.name name5_15_, users0_.password password6_15_, users0_.type type7_15_ users users0_ users0_.email=? print error in retrieving user index: 0, size: 0 java.lang.indexoutofboundsexception: index: 0, size: 0     @ java.util.arraylist.rangecheck(arraylist.java:604)     @ java.util.arraylist.get(arraylist.java:382)     @ web.dao.impl.jpa.usersdaoimpl.getuserbyloginid(usersdaoimpl.java:67)     @ web.service.common.customuserdetailsservice.loaduserbyusername(customuserdetailsservice.java:54)     @ org.springframework.security.authentication.dao.daoauthenticationprovider.retrieveuser(daoauthenticationprovider.java:101)     @ org.springframework.security.authentication.dao.abstractuserdetailsauthenticationprovider.authenticate(abstractuserdetailsauthenticationprovider.java:132)     @ org.springframework.security.authentication.providermanager.authenticate(providermanager.java:156)     @ org.springframework.security.authentication.providermanager.authenticate(providermanager.java:174)     @ org.springframework.security.web.authentication.usernamepasswordauthenticationfilter.attemptauthentication(usernamepasswordauthenticationfilter.java:94)     @ org.springframework.security.web.authentication.abstractauthenticationprocessingfilter.dofilter(abstractauthenticationprocessingfilter.java:195)     @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342)     @ org.springframework.security.web.authentication.logout.logoutfilter.dofilter(logoutfilter.java:105)     @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342)     @ org.springframework.security.web.context.securitycontextpersistencefilter.dofilter(securitycontextpersistencefilter.java:87)     @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:342)     @ org.springframework.security.web.filterchainproxy.dofilterinternal(filterchainproxy.java:192)     @ org.springframework.security.web.filterchainproxy.dofilter(filterchainproxy.java:160)     @ org.springframework.web.filter.delegatingfilterproxy.invokedelegate(delegatingfilterproxy.java:346)     @ org.springframework.web.filter.delegatingfilterproxy.dofilter(delegatingfilterproxy.java:259)     @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:243)     @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:210)     @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:222)     @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:123)     @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:472)     @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:168)     @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:99)     @ org.apache.catalina.valves.accesslogvalve.invoke(accesslogvalve.java:929)     @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:118)     @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:407)     @ org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1002)     @ org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:585)     @ org.apache.tomcat.util.net.jioendpoint$socketprocessor.run(jioendpoint.java:310)     @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1110)     @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:603)     @ java.lang.thread.run(thread.java:722) 

login.jsp form

                                  <form action="${pagecontext.request.contextpath}/j_spring_security_check" method="post">                    <table>                   <tbody>                     <tr>                       <td>                         <img style="height:30px;" src="company.png" />                       </td>                        <td>                         <input type="text" placeholder="company name" />                       </td>                        <td>                       </td>                      </tr>                      <tr>                       <td>                           <img style="height:30px;" src="person.png" />                       </td>                        <td>                         <input id="j_username" type="text" placeholder="log-in id"/>                       </td>                        <td>                         <input type="submit" value="log-in" />                       </td>                      </tr>                      <tr>                       <td>                         <img style="height:30px;" src="password.png" />                       </td>                        <td>                         <input id="j_password" type="password" placeholder="password" />                       </td>                        <td>                         <input type="reset" />                       </td>                      </tr>                     <tr>                       <td>                       </td>                       <td style="text-align:right;">                         forgot password?                       </td>                       <td>                       </td>                     </tr>                       </tbody>                     </table>                   </form> 

customuserdetailservice

    /*  * change template, choose tools | templates  * , open template in editor.  */ package web.service.common;  import java.util.arraylist; import java.util.collection; import java.util.list; import javax.annotation.resource; import org.springframework.beans.factory.annotation.autowired; import org.springframework.dao.dataaccessexception; import org.springframework.security.core.grantedauthority; import org.springframework.security.core.userdetails.user; import org.springframework.security.core.userdetails.userdetails; import org.springframework.security.core.userdetails.userdetailsservice; import org.springframework.security.core.userdetails.usernamenotfoundexception; import org.springframework.stereotype.repository; import org.springframework.stereotype.service; import web.dao.usersdao; import web.dao.impl.jpa.usersdaoimpl; import web.entity.users;   /**  *  * @author syncsys  */ @service public class customuserdetailsservice implements userdetailsservice{      @resource    private usersdao userdao;    /**   * retrieves springuser record containing springuser's credentials , access.   */  public userdetails loaduserbyusername(string email)    throws usernamenotfoundexception, dataaccessexception {     // declare null spring user   userdetails springuser = null;    try {     system.out.println("the email passed customuserdetailsservice in method loaduserbyusername is: " +email);    // search database springuser matches specified email    // can provide custom dao access persistence layer    // or use jdbc access database    // dbuser our custom domain springuser. not same spring's user       system.out.println("debug ---- 1");    users dbuser = userdao.getuserbyloginid(email);     // populate spring user object details dbuser    // here pass email, password, , access level    // getauthorities() translate access level correct role type  system.out.println("debug ---- 2");    springuser =  new user(      dbuser.getemail(),      dbuser.getpassword().tolowercase(),      true,      true,      true,      true,      //getauthorities(dbuser.getaccess()) );      getauthorities(2) );  system.out.println("debug ---- 3");   } catch (exception e) {    system.out.println("print error in retrieving user");    e.printstacktrace();     system.out.println(e.getmessage());    throw new usernamenotfoundexception("error in retrieving user");   }    system.out.println("debug ---- 4");   // return springuser spring processing.   // take note we're not 1 evaluating whether springuser authenticated or valid   // merely retrieve springuser matches specified email   return springuser;  }   /**   * retrieves correct role type depending on access level, access level integer.   * basically, interprets access value whether it's regular springuser or admin.   *   * @param access integer value representing access of springuser   * @return collection of granted authorities   */   public collection<grantedauthority> getauthorities(integer access) {    // create list of grants springuser    list<grantedauthority> authlist = (list<grantedauthority>) new arraylist<grantedauthority>(2);     // users granted role_user access    // therefore springuser gets role_user default    system.out.println("grant role_user user");    authlist.add(new grantedauthorityimpl("role_user"));     // check if springuser has admin access    // interpret integer(1) admin springuser  //   if ( access.compareto(1) == 0) { //    // user has admin access //    logger.debug("grant role_admin user"); //    authlist.add(new grantedauthorityimpl("role_admin")); //   }     // return list of granted authorities    return authlist;    }  } 

user dao

package web.dao.impl.jpa;  import java.util.arraylist; import java.util.list; import javax.persistence.entitymanager; import javax.persistence.persistencecontext; import javax.persistence.query;  import org.hibernate.session; import org.springframework.beans.factory.annotation.autowired; import org.springframework.security.core.userdetails.usernamenotfoundexception; import org.springframework.stereotype.repository; import web.dao.usersdao; import web.entity.users;    /**  *   * @version $revision$  * @since   1.0  */ @repository public class usersdaoimpl implements usersdao {      /**      * jpa entity manager      */ //        @autowired     private entitymanager entitymanager;      /**      * set entity manager      *       * @param entitymanager      */          /**      * saves or updates existing user entity instance.      *       * @param user  user entity      * @return      managed user entity instance      */     public users saveorupdate(users user) {         if(user.getid() == 0) {             entitymanager.persist(user);                         return user;          }         else             entitymanager.merge(user);                         return user;     }          public users getuserbyloginid(string email){             system.out.println("email entered lookup : "+email);             system.out.println("debug --- a");             string querystring = "select user users user " +                          "where user.email = :email";             query query = entitymanager.createquery(querystring);             system.out.println("debug --- b");             query.setparameter("email", email);              list<?> list = query.getresultlist();              system.out.println("email retrieved is" +((users)list.get(0)).getemail() );             system.out.println("debug --- c");             if(list == null || list.size() == 0) throw new usernamenotfoundexception("user not found");            users user = (users)list.get(0);            system.out.println("debug --- d");            system.out.println(user.getemail());            return user; //            return (users)list.get(0);          }       @persistencecontext     public void setentitymanager(entitymanager entitymanager) {         this.entitymanager = entitymanager;     }      /**      * helper method return hibernate session jpa      * entity manager implementation.      *       * @return hibernate {#link session}      */     protected session gethibernatesession() {         return entitymanager.unwrap(session.class);     }    } 

user controller

/*  * change template, choose tools | templates  * , open template in editor.  */ package web.controller;  import org.springframework.beans.factory.annotation.autowired; import org.springframework.stereotype.controller; import org.springframework.ui.modelmap; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.requestmethod; import org.springframework.web.bind.annotation.requestparam; import web.entity.users; import web.service.userservice;  /**  *  * @author syncsys  */ @controller public class usercontroller {     @autowired     private userservice userservice;        @requestmapping(value = "/login", method = requestmethod.get)     public string getloginpage(@requestparam(value="error", required=false) boolean error,       modelmap model) {      system.out.println("received request show login page");       // add error message model if login unsuccessful      // 'error' parameter set true based on when authentication has failed.      // declared under authentication-failure-url attribute inside spring-security.xml      /* see below:       <form-login        login-page="/krams/auth/login"        authentication-failure-url="/krams/auth/login?error=true"        default-target-url="/krams/main/common"/>*/      if (error == true) {       // assign error message       model.put("error", "you have entered invalid username or password!");      } else {       model.put("error", "");      }       // resolve /web-inf/jsp/loginpage.jsp      return "login";     }  //    @requestmapping(value = "/create", method = requestmethod.get )     @requestmapping(value = "/create" )     public string creatuser(modelmap model){         users user = new users();         user.setemail("myemail@mydomain.com");         user.setname("myname");         userservice.saveorupdate(user);         system.out.println("created--------------------");         return "create";            }      @requestmapping("/users")     public string showusers(modelmap model){         return "index";            }       @requestmapping("/loginfail")     public string loginfail(modelmap model){         return "login-fail";            } } 

dispatcher

<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"   xmlns:mvc="http://www.springframework.org/schema/mvc"   xmlns:context="http://www.springframework.org/schema/context"   xmlns:tx="http://www.springframework.org/schema/tx"   xsi:schemalocation="         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd" >       <context:component-scan base-package="web" >     <context:include-filter type="annotation" expression="org.springframework.stereotype.service"       />         <context:include-filter type="annotation" expression="org.springframework.stereotype.repository"    />     </context:component-scan>    <mvc:annotation-driven /> <!--  <context:annotation-config />-->     <bean class="org.springframework.web.servlet.mvc.support.controllerclassnamehandlermapping"/>      <!--     controllers use controllerclassnamehandlermapping above,     index controller using parameterizableviewcontroller, must     define explicit mapping it.     -->     <bean id="urlmapping" class="org.springframework.web.servlet.handler.simpleurlhandlermapping">         <property name="mappings">             <props>                 <prop key="index.htm">indexcontroller</prop>             </props>         </property>     </bean>      <bean id="viewresolver"                 class="org.springframework.web.servlet.view.internalresourceviewresolver"> <!--          class="org.springframework.web.servlet.view.internalresourceviewresolver">-->  <!--             class="org.springframework.web.servlet.view.urlbasedviewresolver" >-->           <property name="prefix" value="/web-inf/view/jsp/" />             <property name="suffix" value=".jsp" />     </bean>              <!--     index controller.     -->     <bean name="indexcontroller"           class="org.springframework.web.servlet.mvc.parameterizableviewcontroller">           <property name="viewname" value="index" />     </bean>         <!---      ##########################################################################     hibernate      --> <!--    <bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource">         <property name="driverclassname" value="org.postgresql.driver" />         <property name="url" value="${jdbc.url}jdbc:postgresql://localhost:5432/postgres" />         <property name="username" value="postgres" />         <property name="password" value="abc" />     </bean>      <bean id="sessionfactory" class="org.springframework.orm.hibernate4.localsessionfactorybean">         <property name="datasource" ref="datasource"/>         <property name="packagestoscan" value="web.entity" />         </property>         <property name="hibernateproperties">             <props>                 <prop key="hibernate.dialect">org.hibernate.dialect.postgresqldialect</prop>                 <prop key="hibernate.show_sql">true</prop>                 <prop key="cache.provider_class">org.hibernate.cache.internal.nocacheprovider</prop>             </props>          </property>     </bean>      <tx:annotation-driven transaction-manager="transactionmanager"/>      <bean id="transactionmanager" class="org.springframework.orm.hibernate4.hibernatetransactionmanager">         <property name="sessionfactory" ref="sessionfactory"/>     </bean>      ###########################################################     -->   <!--      jpa based instead of hibernate  -->         <bean class="org.springframework.orm.jpa.support.persistenceannotationbeanpostprocessor"/> <!--          configures entitymanagerfactory object used jpa/spring managed persistent objects.       -->     <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localcontainerentitymanagerfactorybean">         <property name="persistencexmllocation" value="classpath*:meta-inf/persistence.xml" />         <property name="persistenceunitname" value="persistence-unit-demo" />          <property name="datasource" ref="datasource" />                 <property name="packagestoscan" value="web.entity" />         <property name="jpavendoradapter">             <bean class="org.springframework.orm.jpa.vendor.hibernatejpavendoradapter">                                 <property name="database" value="postgresql" /> <!--    giving errors       <property name="databaseplatorm" value="org.hibernate.dialect.postgresqldialect"/>--> <!--                                <property name="database" value="hsql" />-->                 <property name="showsql" value="true" />                 <property name="generateddl" value="true" />                                     </bean>         </property>                    <property name="jpaproperties">                     <props>                         <prop key="hibernate.hbm2ddl.auto">create-drop</prop>                     </props>                 </property>                              </bean>      <bean id="jpadialect" class="org.springframework.orm.jpa.vendor.hibernatejpadialect" />     <!-- pulls database connection tomcat container's context database pool via jndi --> <!--    <jee:jndi-lookup id="datasource" jndi-name="jdbc/mssqlserver" resource-ref="true"/>-->          <bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource" >             <property name="driverclassname" value="org.postgresql.driver" />             <property name="url" value="jdbc:postgresql://localhost:5432/postgres" />             <property name="username" value="postgres" />             <property name="password" value="abc" />         </bean>        <!--         sets our transaction manager.       -->     <bean id="transactionmanager" class="org.springframework.orm.jpa.jpatransactionmanager">         <property name="entitymanagerfactory" ref="entitymanagerfactory" />         <property name="jpadialect" ref="jpadialect" />         <property name="datasource" ref="datasource" /> <!-- giving errors               <property name="loadtimeweaver">                     <bean class="org.springframework.instrument.classloading.instrumentationloadtimeweaver" />                 </property>-->     </bean>          <!--         defines our transaction manager transactional annotations.      -->     <tx:annotation-driven transaction-manager="transactionmanager" />      <bean id="sessionfactory" factory-bean="entitymanagerfactory" factory-method="getsessionfactory" />      </beans> 

web.xml

    <?xml version="1.0" encoding="utf-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">      <listener>         <listener-class>org.springframework.web.context.contextloaderlistener</listener-class>     </listener>     <servlet>         <servlet-name>springdispatcher</servlet-name>         <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>         <load-on-startup>1</load-on-startup>     </servlet>     <servlet-mapping>         <servlet-name>springdispatcher</servlet-name>         <url-pattern>/</url-pattern>     </servlet-mapping>     <session-config>         <session-timeout>             30         </session-timeout>     </session-config>     <welcome-file-list>         <welcome-file>redirect.jsp</welcome-file>     </welcome-file-list>           <filter>         <filter-name>springsecurityfilterchain</filter-name>         <filter-class>org.springframework.web.filter.delegatingfilterproxy</filter-class>     </filter>      <filter-mapping>         <filter-name>springsecurityfilterchain</filter-name>         <url-pattern>/*</url-pattern>     </filter-mapping>      <context-param>         <param-name>contextconfiglocation</param-name>         <param-value>             /web-inf/spring-security.xml             /web-inf/applicationcontext.xml         </param-value>     </context-param> </web-app> 

applicationcontext.xml

<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans"        xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"        xmlns:p="http://www.springframework.org/schema/p"        xmlns:aop="http://www.springframework.org/schema/aop"        xmlns:tx="http://www.springframework.org/schema/tx"        xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">      <!--bean id="propertyconfigurer"           class="org.springframework.beans.factory.config.propertyplaceholderconfigurer"           p:location="/web-inf/jdbc.properties" />  <bean id="datasource"     class="org.springframework.jdbc.datasource.drivermanagerdatasource"     p:driverclassname="${jdbc.driverclassname}"     p:url="${jdbc.url}"     p:username="${jdbc.username}"     p:password="${jdbc.password}" /-->      <!-- add persistence support here (jpa, hibernate, etc) -->      <import resource="springdispatcher-servlet.xml" />  </beans> 

spring-security.xml

<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"     xmlns:security="http://www.springframework.org/schema/security"  xsi:schemalocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    http://www.springframework.org/schema/security    http://www.springframework.org/schema/security/spring-security-3.1.xsd">   <!-- configure spring-security  -->  <security:http auto-config="true" use-expressions="true" access-denied-page="/loginfail" >    <security:intercept-url pattern="/login**" access="permitall"/> <!--  <security:intercept-url pattern="/krams/main/admin" access="hasrole('role_admin')"/>-->   <security:intercept-url pattern="/tem/*" access="hasrole('role_user')"/>     <security:form-login     login-page="/login"     authentication-failure-url="/loginfail?error=true"     default-target-url="/index"/>    <security:logout     invalidate-session="true"     logout-success-url="/logout"     logout-url="/logout"/>   </security:http>   <!-- declare authentication-manager use custom userdetailsservice -->  <security:authentication-manager>          <security:authentication-provider user-service-ref="customuserdetailsservice">   <!--         <security:password-encoder ref="passwordencoder"/>-->          </security:authentication-provider>  </security:authentication-manager>   <!-- use md5 encoder since user's passwords stored md5 in database   <bean class="org.springframework.security.authentication.encoding.md5passwordencoder" id="passwordencoder"/>  -->  <!-- custom service spring retrieve users , corresponding access levels  -->  <bean id="customuserdetailsservice" class="web.service.common.customuserdetailsservice"/>      </beans> 

:) added name=j_username in <input id="j_username" name="j_username" type="text" placeholder="log-in id"/> , worked.

thanks l3eta on rizon irc chat network.


Comments

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

How to get multiresult with multicondition in Sql Server -