详解Spring Boot Oauth2缓存UserDetails到Ehcache

 更新时间:2018年08月08日 11:11:41   作者:五毛程序员  
这篇文章主要介绍了详解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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringMVC基于阻塞队列LinkedBlockingQueue的同步长轮询功能实现详解

    SpringMVC基于阻塞队列LinkedBlockingQueue的同步长轮询功能实现详解

    这篇文章主要介绍了SpringMVC基于阻塞队列LinkedBlockingQueue的同步长轮询功能实现详解,本文介绍的也是生产者消费者的一种实现,生产者不必是一个始终在执行的线程,它可以是一个接口,接受客户端的请求,向队列中插入消息,需要的朋友可以参考下
    2023-07-07
  • IntelliJ IDEA本地代码覆盖后恢复原来的代码图解

    IntelliJ IDEA本地代码覆盖后恢复原来的代码图解

    今天小编就为大家分享一篇关于IntelliJ IDEA本地代码覆盖后恢复原来的代码图解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • mybatis-plus添加数据时id自增问题及解决

    mybatis-plus添加数据时id自增问题及解决

    这篇文章主要介绍了mybatis-plus添加数据时id自增问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • SpringBoot框架DataSource多数据源配置方式

    SpringBoot框架DataSource多数据源配置方式

    这篇文章主要介绍了SpringBoot框架DataSource多数据源配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java实现MD5加密算法方法例子

    Java实现MD5加密算法方法例子

    这篇文章主要给大家介绍了关于Java实现MD5加密算法方法的相关资料,MD5加密是一种常见的加密方式,我们经常用在保存用户密码和关键信息上,需要的朋友可以参考下
    2023-10-10
  • Springboot全局异常捕获及try catch区别解析

    Springboot全局异常捕获及try catch区别解析

    这篇文章主要介绍了Springboot全局异常捕获及try catch区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java抽奖算法第二例

    Java抽奖算法第二例

    这篇文章主要为大家详细介绍了Java抽奖算法,根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取随机数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 关于@Value注入List,Map及设置默认值问题

    关于@Value注入List,Map及设置默认值问题

    这篇文章主要介绍了@Value注入List,Map及设置默认值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java可变参数使用示例

    java可变参数使用示例

    这篇文章主要介绍了java可变参数使用示例,需要的朋友可以参考下
    2014-04-04
  • Java  解决死锁的方法实例详解

    Java 解决死锁的方法实例详解

    这篇文章主要介绍了java 多线程死锁详解及简单实例的相关资料,需要的朋友可以参考下
    2017-04-04

最新评论