1. 程式人生 > >Spring Security學習筆記-許可權快取

Spring Security學習筆記-許可權快取

SpringSecurity-許可權快取

   SpringSecurity的許可權快取和資料庫管理有關,都是在使用者認證上做文章,因此都與UserDetailsService有關,與資料庫管理不同的是,SpringSecurity提供了一個實現了可以快取UserDetailsService的實現類,這個類的名字叫CachingUserDetailsService。

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

   該類的構造接受了一個用於真正載入UserDetails的UserDetailsService實現類。當需要載入UserDetails時,會首先從快取中獲取,如果快取中沒有對應的UserDetails存在,則使用持有的UserDetailsService實現類進行載入,並將載入後的結果放在快取中,UserDetails與快取的互動是通過UserCache介面來實現的,cachingUserDetailsService預設擁有UserCache的一個空引用實現叫做NullUserCache(),當快取中不存在對應的UserDetails時,將使用引用的UserDetailsService型別的delegate進行載入,載入後再把它存放到cache中並進行返回。除了NullUserCache之外,SpringSecurity還為我們提供了一個基於EhCache的UserServIce的實現類EhCacheBaseUserCache。當我們需要對UserDetails進行快取時,我們只需要定義一個EhCache的例項,然後把它注入到EhCacheBaseUserCache就可以了。
   在實際專案中,為了能更好的使用及控制快取,往往會嘗試引入更多的cache,不僅會快取UserCache還會快取使用者相關的許可權,使用的也不僅是記憶體級別的cache或者EhCache,還會選擇使用redis,memerCache,javaCache等來做許可權快取。