2014-05-15 27 views
0

我試圖使用Spring安全性來進行身份驗證,所以我所做的是實現一個UserDetailsService,並且我使用UserDao從database.so我有兩個文件的applicationContext配置和安全的問題是,當我調試,我得到:Spring安全性身份驗證失敗:錯誤org.hibernate.HibernateException:找不到當前線程的會話

error org.hibernate.HibernateException: No Session found for current threadDaoAuthenticationProvider類和奇怪的是在UserDetailsService會話實例化。

的ApplicationContext:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close"> 
      <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
      <property name="url" value="jdbc:mysql://localhost/InTouch" /> 
      <property name="username" value="root" /> 
      <property name="password" value="" /> 
     </bean> 

     <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
      <property name="dataSource"> 
       <ref bean="dataSource" /> 
      </property> 
      <property name="annotatedClasses"> 
       <list> 
    ...... 
       </list> 
      </property> 
      <property name="hibernateProperties"> 
       <props> 
        <prop key="hibernate.query.substitutions">true 1, false 0, yes 'Y', no 'N'</prop> 
        <prop key="hibernate.show_sql">false</prop> 
        <prop key="hibernate.use_sql_comments">true</prop> 
        <prop key="hibernate.hbm2ddl.auto">update</prop> 
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
        <prop key="hibernate.search.default.directory_provider">org.hibernate.search.store.FSDirectoryProvider</prop> 
        <prop key="hibernate.search.default.indexBase">/tmp/lucene_dev</prop> 
       </props> 
      </property> 
     </bean> 

     <bean id="transactionManager" 
      class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
      <property name="sessionFactory"> 
       <ref bean="sessionFactory" /> 
      </property> 
     </bean> 

> <aop:config>  <aop:pointcut id="transactionPointcut" 
>   expression="execution(* 
> ma.csimaroc.core.profil.services.interfaces..*.*(..))" /> 
>  <aop:advisor advice-ref="txAdvice" 
> pointcut-ref="transactionPointcut" />  </aop:config> 

的security.xml:

<beans:bean 
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" 
    id="passwordEncoder" /> 

    <beans:bean id="customUserDetailsService" 
     class="ma.csimaroc.core.profil.services.impl.CustomUserDetailsService" 
     autowire="byName" /> 

    <beans:bean id="authProvider" 
     class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
     <beans:property name="userDetailsService" ref="customUserDetailsService" /> 
     <beans:property name="passwordEncoder" ref="passwordEncoder" /> 
    </beans:bean> 

    <authentication-manager> 
     <authentication-provider ref="authProvider" /> 
    </authentication-manager> 

CustomUserDetailsS​​ervice:

public class CustomUserDetailsService implements UserDetailsService { 

UserDao userDao; 

public UserDetails loadUserByUsername(String username) 
     throws UsernameNotFoundException { 

    UserDetails user = null; 

    UserBD userBean = userDao.getUserByName(username); 

    System.out.println(userBean.getUsername()); 

    List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(); 

    authList.add(new SimpleGrantedAuthority(userBean.getUserRole() 
      .getRole())); 

    user = new User(userBean.getUsername(), userBean.getPassword() 
      .toLowerCase(), true, true, true, true, authList); 

    return user; 
} 

public UserDao getUserDao() { 
    return userDao; 
} 

public void setUserDao(UserDao userDao) { 
    this.userDao = userDao; 
} 

web.xml中:

<context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml 
        /WEB-INF/security.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<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> 

回答

1

聲明成的ApplicationContext:

<tx:annotation-driven transaction-manager="transactionManager"/> 

爲了使用TX聲明以下XML命名空間:

xmlns:tx="http://www.springframework.org/schema/tx" 
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd 

這將使@Transactional註解。

然後用@TransactionalCustomUserDetailsService

希望這有助於註釋。

+0

我使用 \t \t \t \t \t

相關問題