zoukankan      html  css  js  c++  java
  • Spring Boot Oauth2缓存UserDetails到Ehcache

    在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模式为UserDetailsService提供缓存功能。该类源码如下:

    CachingUserDetailsService.java

    public class CachingUserDetailsService implements UserDetailsService {
        private UserCache userCache = new NullUserCache();
        private final UserDetailsService delegate;
    
        CachingUserDetailsService(UserDetailsService delegate) {
            this.delegate = delegate;
        }
    
        public UserCache getUserCache() {
            return this.userCache;
        }
    
        public void setUserCache(UserCache userCache) {
            this.userCache = userCache;
        }
    
        public UserDetails loadUserByUsername(String username) {
            UserDetails user = this.userCache.getUserFromCache(username);
            if (user == null) {
                user = this.delegate.loadUserByUsername(username);
            }
    
            Assert.notNull(user, "UserDetailsService " + this.delegate + " returned null for username " + username + ". This is an interface contract violation");
            this.userCache.putUserInCache(user);
            return user;
        }
    }
    

    CachingUserDetailsService默认的userCache属性值为new NullUserCache(),该对象并未实现缓存。因为我打算使用EhCache来缓存UserDetails,所以需要使用Spring的EhCacheBasedUserCache类,该类是UserCache接口的实现类,主要是缓存操作。

    缓存UserDetails到Ehcache的具体实现如下:

    ehcache.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
        <!-- 磁盘缓存位置 -->
        <diskStore path="java.io.tmpdir" />
    
        <cache name="userCache"
               maxElementsInMemory="0"
               eternal="true"
               overflowToDisk="true"
               diskPersistent="true"
               memoryStoreEvictionPolicy="LRU">
        </cache>
    </ehcache>
    

    UserDetailsCacheConfig.java

    @Slf4j
    @Configuration
    public class UserDetailsCacheConfig {
        @Autowired
        private CustomUserDetailsService customUserDetailsService;
    
        @Bean
        public UserCache userCache(){
            try {
                EhCacheBasedUserCache userCache = new EhCacheBasedUserCache();
                val cacheManager = CacheManager.getInstance();
                val cache = cacheManager.getCache("userCache");
                userCache.setCache(cache);
                return userCache;
            } catch (Exception e) {
                e.printStackTrace();
                log.error(e.getMessage());
            }
            return null;
        }
    
        @Bean
        public UserDetailsService userDetailsService(){
            Constructor<CachingUserDetailsService> ctor = null;
            try {
                ctor = CachingUserDetailsService.class.getDeclaredConstructor(UserDetailsService.class);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
            Assert.notNull(ctor, "CachingUserDetailsService constructor is null");
            ctor.setAccessible(true);
    
            CachingUserDetailsService cachingUserDetailsService = BeanUtils.instantiateClass(ctor, customUserDetailsService);
            cachingUserDetailsService.setUserCache(userCache());
            return cachingUserDetailsService;
        }
    }
    

    使用

    @Autowired
    private UserDetailsService userDetailsService;
    

    欢迎关注我的oauthserver项目,仅仅需要运行建表sql,修改数据库的连接配置,即可得到一个Spring Boot Oauth2 Server微服务。项目地址https://github.com/jeesun/oauthserver

  • 相关阅读:
    【7.19 graphshortestpath graphallshortestpaths函数】matlab 求最短路径函数总结
    【7.18 灾情巡视路线代码】
    【7.18总结】KM算法
    【7.17总结】 匈牙利算法(二分图最大匹配)
    动态规划 多段图最短路 有向图
    matlab 单元最短路 Dijkstra算法 无向图
    hdu 3536【并查集】
    博弈随笔
    AtCoder Regular Contest 094 D Worst Case【思维题】
    CODE FESTIVAL 2017 qual B C 3 Steps(补题)
  • 原文地址:https://www.cnblogs.com/rainmer/p/9417108.html
Copyright © 2011-2022 走看看