详解Spring Boot Oauth2缓存UserDetails到Ehcache

作者:五毛程序员 时间:2023-02-26 21:57:12 

在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

来源:http://www.cnblogs.com/rainmer/p/9417108.html

标签:Spring,Boot,Oauth2,缓存
0
投稿

猜你喜欢

  • Android自定义View实现绘制虚线的方法详解

    2022-06-24 01:18:10
  • java实现图片转base64字符串 java实现base64字符串转图片

    2023-07-19 10:42:44
  • 一文带你搞懂Java中的泛型和通配符

    2023-12-10 16:15:07
  • Spring使用三级缓存解决循环依赖的问题

    2023-03-14 09:06:15
  • Java爬虫范例之使用Htmlunit爬取学校教务网课程表信息

    2021-07-17 00:52:51
  • Android带圆形数字进度的自定义进度条示例

    2021-10-04 20:20:01
  • Java多文件以ZIP压缩包导出的实现方法

    2023-10-08 14:05:20
  • Android实现登录注册功能封装

    2023-03-20 08:46:46
  • C#反射应用实例

    2023-11-03 14:47:46
  • Springcloud整合stream,rabbitmq实现消息驱动功能

    2023-07-16 10:46:08
  • windows下java环境变量的设置方法

    2022-12-01 03:13:14
  • 如何解决springmvc文件下载,内容损坏的问题

    2023-10-11 07:12:10
  • Java虚拟机内存结构及编码实战分享

    2023-11-29 13:47:47
  • 详解C#如何加密解密RAR文件

    2023-09-19 16:25:10
  • spring启动加载程序的几种方法介绍

    2022-03-11 14:15:32
  • Android中post请求传递json数据给服务端的实例

    2022-04-21 01:51:18
  • 浅谈java安全编码指南之死锁dead lock

    2023-06-22 04:49:19
  • C#使用Socket实现本地多人聊天室

    2022-01-06 12:47:27
  • Flutter输入框TextField属性及监听事件介绍

    2023-07-09 10:28:51
  • C# Razor语法规则

    2021-07-27 23:53:43
  • asp之家 软件编程 m.aspxhome.com