Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何将usercache与自定义daoauthenticationprovider一起使用_Hibernate_Spring_Spring Security_Ehcache - Fatal编程技术网

Hibernate 如何将usercache与自定义daoauthenticationprovider一起使用

Hibernate 如何将usercache与自定义daoauthenticationprovider一起使用,hibernate,spring,spring-security,ehcache,Hibernate,Spring,Spring Security,Ehcache,我需要使用spring提供的usercache,但似乎无法让它工作。就我所见,我甚至不认为我的userdetailsService实现在将其用作daoAuthenticationProvider(我寻求使用其功能)中的引用时被接受。我已经做了以下工作: <beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/> <beans

我需要使用spring提供的usercache,但似乎无法让它工作。就我所见,我甚至不认为我的userdetailsService实现在将其用作daoAuthenticationProvider(我寻求使用其功能)中的引用时被接受。我已经做了以下工作:

<beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
    <beans:property name="cache" ref="userCacheBackend"/>
</beans:bean>   

<beans:bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     <beans:property name="configLocation" value="classpath:/ehcache.xml"/>
</beans:bean>

<beans:bean id="userCacheBackend" class="rg.springframework.cache.ehcache.EhCacheFactoryBean">
    <beans:property name="cacheManager" ref="cacheManager"/>
    <beans:property name="cacheName" value="userCache"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userDao">
        <password-encoder ref="encoder" /> 
    </authentication-provider>
</authentication-manager>

<beans:bean id="daoAuthenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDao"/>
        <beans:property name="passwordEncoder" ref="encoder"/> 
        <beans:property name="userCache" ref="userCache"/>
</beans:bean>
1) 使用我自己的HibernateDao实现UserDetailsInterface

<beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
    <beans:property name="cache" ref="userCacheBackend"/>
</beans:bean>   

<beans:bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     <beans:property name="configLocation" value="classpath:/ehcache.xml"/>
</beans:bean>

<beans:bean id="userCacheBackend" class="rg.springframework.cache.ehcache.EhCacheFactoryBean">
    <beans:property name="cacheManager" ref="cacheManager"/>
    <beans:property name="cacheName" value="userCache"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userDao">
        <password-encoder ref="encoder" /> 
    </authentication-provider>
</authentication-manager>

<beans:bean id="daoAuthenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDao"/>
        <beans:property name="passwordEncoder" ref="encoder"/> 
        <beans:property name="userCache" ref="userCache"/>
</beans:bean>
2) 按照第1点的规定提供了我自己的loadbyusername(字符串用户名)方法

<beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
    <beans:property name="cache" ref="userCacheBackend"/>
</beans:bean>   

<beans:bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     <beans:property name="configLocation" value="classpath:/ehcache.xml"/>
</beans:bean>

<beans:bean id="userCacheBackend" class="rg.springframework.cache.ehcache.EhCacheFactoryBean">
    <beans:property name="cacheManager" ref="cacheManager"/>
    <beans:property name="cacheName" value="userCache"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userDao">
        <password-encoder ref="encoder" /> 
    </authentication-provider>
</authentication-manager>

<beans:bean id="daoAuthenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDao"/>
        <beans:property name="passwordEncoder" ref="encoder"/> 
        <beans:property name="userCache" ref="userCache"/>
</beans:bean>
3) 配置我的应用程序上下文:

<beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
    <beans:property name="cache" ref="userCacheBackend"/>
</beans:bean>   

<beans:bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     <beans:property name="configLocation" value="classpath:/ehcache.xml"/>
</beans:bean>

<beans:bean id="userCacheBackend" class="rg.springframework.cache.ehcache.EhCacheFactoryBean">
    <beans:property name="cacheManager" ref="cacheManager"/>
    <beans:property name="cacheName" value="userCache"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userDao">
        <password-encoder ref="encoder" /> 
    </authentication-provider>
</authentication-manager>

<beans:bean id="daoAuthenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDao"/>
        <beans:property name="passwordEncoder" ref="encoder"/> 
        <beans:property name="userCache" ref="userCache"/>
</beans:bean>

<beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
    <beans:property name="cache" ref="userCacheBackend"/>
</beans:bean>   

<beans:bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     <beans:property name="configLocation" value="classpath:/ehcache.xml"/>
</beans:bean>

<beans:bean id="userCacheBackend" class="rg.springframework.cache.ehcache.EhCacheFactoryBean">
    <beans:property name="cacheManager" ref="cacheManager"/>
    <beans:property name="cacheName" value="userCache"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userDao">
        <password-encoder ref="encoder" /> 
    </authentication-provider>
</authentication-manager>

<beans:bean id="daoAuthenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDao"/>
        <beans:property name="passwordEncoder" ref="encoder"/> 
        <beans:property name="userCache" ref="userCache"/>
</beans:bean>

但是,尽管将我的userDao设置为userDetailsService属性名,但我似乎无法使用实现userDetailsService接口(将是我的HibernateDao)的DaoAuthenticationProvider和AbstractUserDetailsAuthenticationProvider类提供的任何功能

<beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
    <beans:property name="cache" ref="userCacheBackend"/>
</beans:bean>   

<beans:bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     <beans:property name="configLocation" value="classpath:/ehcache.xml"/>
</beans:bean>

<beans:bean id="userCacheBackend" class="rg.springframework.cache.ehcache.EhCacheFactoryBean">
    <beans:property name="cacheManager" ref="cacheManager"/>
    <beans:property name="cacheName" value="userCache"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userDao">
        <password-encoder ref="encoder" /> 
    </authentication-provider>
</authentication-manager>

<beans:bean id="daoAuthenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDao"/>
        <beans:property name="passwordEncoder" ref="encoder"/> 
        <beans:property name="userCache" ref="userCache"/>
</beans:bean>
这是我的hibernate dao:

<beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
    <beans:property name="cache" ref="userCacheBackend"/>
</beans:bean>   

<beans:bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     <beans:property name="configLocation" value="classpath:/ehcache.xml"/>
</beans:bean>

<beans:bean id="userCacheBackend" class="rg.springframework.cache.ehcache.EhCacheFactoryBean">
    <beans:property name="cacheManager" ref="cacheManager"/>
    <beans:property name="cacheName" value="userCache"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userDao">
        <password-encoder ref="encoder" /> 
    </authentication-provider>
</authentication-manager>

<beans:bean id="daoAuthenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDao"/>
        <beans:property name="passwordEncoder" ref="encoder"/> 
        <beans:property name="userCache" ref="userCache"/>
</beans:bean>
@Repository("userDao")
public class HibernateUserDao extends HibernateBaseDao<User, Long> implements
    UserDao, UserDetailsService{ etc ....................

@Transactional

public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException {

    logger.warn(" loadByUserName has been invoked for username " + username);
    List users = getSessionFactory().getCurrentSession().
            createQuery("from User where username=?")
            .setParameter(0, username).list();
    if (users == null || users.isEmpty()) {
        throw new UsernameNotFoundException("user '" + username
                + "' not found...");
    } else {
        return (UserDetails) users.get(0); 
    }
}
@Repository(“userDao”)
公共类HibernateUserDao扩展了HibernateBaseDao实现
UserDao、UserDetailsService{etc。。。。。。。。。。。。。。。。。。。。
@交易的
公共用户详细信息loadUserByUsername(字符串用户名)
抛出UsernameNotFoundException{
logger.warn(“已为用户名“+用户名”调用loadByUserName);
列表用户=getSessionFactory().getCurrentSession()。
createQuery(“来自用户名=?”的用户)
.setParameter(0,用户名).list();
if(users==null | | users.isEmpty()){
抛出新的UsernameNotFoundException(“用户“”+用户名
+“‘未找到……);
}否则{
return(UserDetails)users.get(0);
}
}

我做的事情真的很愚蠢吗?请帮助我,我疯了。

HibernateUserDao是自动连接的,但我认为这不会有任何影响。您是否定义了spring注释来获取您的响应注释是的,我这样做。它如下所示
<beans:bean id="encoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"/>

<beans:bean id="userCache" class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">
    <beans:property name="cache" ref="userCacheBackend"/>
</beans:bean>   

<beans:bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
     <beans:property name="configLocation" value="classpath:/ehcache.xml"/>
</beans:bean>

<beans:bean id="userCacheBackend" class="rg.springframework.cache.ehcache.EhCacheFactoryBean">
    <beans:property name="cacheManager" ref="cacheManager"/>
    <beans:property name="cacheName" value="userCache"/>
</beans:bean>

<authentication-manager>
    <authentication-provider user-service-ref="userDao">
        <password-encoder ref="encoder" /> 
    </authentication-provider>
</authentication-manager>

<beans:bean id="daoAuthenticationProvider"
        class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDao"/>
        <beans:property name="passwordEncoder" ref="encoder"/> 
        <beans:property name="userCache" ref="userCache"/>
</beans:bean>