как использовать кэш пользователя с пользовательским поставщиком daoauthenticationprovider - PullRequest
1 голос
/ 10 ноября 2011

Мне нужно использовать usercache, предоставленный Spring, но не могу заставить его работать. Насколько я вижу, я даже не думаю, что моя реализация userdetailsService поднимается при использовании ее в качестве ссылки в daoAuthenticationProvider (функциональность которого я пытаюсь использовать). Я сделал следующее:

1) Реализован интерфейс UserDetailsInterface с использованием моего собственного HibernateDao

2) Предоставил мой собственный метод loadbyusername (String username), как указано в пункте 1

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>

Однако, несмотря на установку моего userDao в качестве имени свойства userDetailsService, я не могу использовать какую-либо функциональность, предоставляемую классами DaoAuthenticationProvider и AbstractUserDetailsAuthenticationProvider, которые реализуют интерфейс UserDetailsService (который будет моим HibernateDao).

Вот мой спящий дао:

@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); 
    }
}

Я делаю что-то действительно глупое? Пожалуйста, помогите Я сошел с ума.

...