博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot Oauth2缓存UserDetails到Ehcache
阅读量:6319 次
发布时间:2019-06-22

本文共 2721 字,大约阅读时间需要 9 分钟。

hot3.png

在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

UserDetailsCacheConfig.java

@Slf4j@Configurationpublic 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
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; }}

使用

@Autowiredprivate UserDetailsService userDetailsService;

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

转载于:https://my.oschina.net/raindroid/blog/1922384

你可能感兴趣的文章
IE6-IE9兼容性问题列表及解决办法_补充之四:HTC (Html Components) 功能逐渐被IE抛弃...
查看>>
Verilog与C/C++的一些区别
查看>>
DIV焦点事件详解 --【focus和tabIndex】
查看>>
vim php代码规范
查看>>
最最基本的Git入门 -- 本地仓库操作
查看>>
机器学习平台跃迁,AI中台才是大势所趋
查看>>
Imperva开源域目录控制器,简化活动目录集成
查看>>
微软发布预览版SQL Server跨平台开发工具
查看>>
Uber推出数据湖集成神器DBEvents,支持MySQL、Cassandra等
查看>>
Entity Framework Core 2.0的新特性
查看>>
[deviceone开发]-do_Http组件示例
查看>>
实现linux作为server时与windows间的数据同步
查看>>
Spring JDBC详解
查看>>
连连看路径求解的算法
查看>>
JavaScript 的面向对象编程
查看>>
kafka的topic和分区策略——log entry和消息id索引文件
查看>>
splunk的bucket组织目录——时间序列,按照时间来组织目录
查看>>
简单的分页控件(原创)
查看>>
NeHe OpenGL教程 第十课:3D世界
查看>>
Garbage First(G1)垃圾收集器
查看>>