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等來做許可權快取。