Spring Boot Oauth2緩存UserDetails到Ehcache
阿新 • • 發佈:2018-08-04
ons ssa ola con elements pri ava public cti
在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
Spring Boot Oauth2緩存UserDetails到Ehcache