package com.iplatform.base.cache; import com.iplatform.base.Constants; import com.iplatform.base.DefaultUserPrincipal; import com.iplatform.base.VariableConstants; import com.iplatform.base.util.TokenUtils; import com.iplatform.base.util.UserUtils; import com.walker.cache.Cache; import com.walker.infrastructure.utils.JsonUtils; import com.walker.infrastructure.utils.StringUtils; import com.walker.support.redis.cache.RedisCacheProvider; import com.walker.web.UserOnlineProvider; import com.walker.web.UserPrincipal; /** * Redis实现的用户登录缓存提供者。 * @author 时克英 * @date 2022-11-14 */ public class RedisUserOnlineProvider extends RedisCacheProvider implements UserOnlineProvider { public RedisUserOnlineProvider(){ this.setUseRedis(true); this.setLoadPage(false); // 2024-01-05 设置支持缓存失效,该参数很重要,如果需要失效而没有设置在调用后会出现数据无法失效! this.setSupportExpiredCache(true); } @Override public String getProviderName() { return Constants.CACHE_NAME_ONLINE_USER; } @Override public Class getProviderType() { return String.class; } @Override protected int loadDataToCache(Cache cache){ // 因为登录缓存在redis中,因此启动时无需重新加载 return 0; } @Override public UserPrincipal getUserPrincipal(String token) { // UserPrincipal userPrincipal = this.getCacheData(token); String userJson = this.getCacheData(token); if(StringUtils.isEmpty(userJson)){ logger.warn("缓存未获取登录信息, token=" + token); return null; } try { // 由于存在泛型,因此直接调用 JsonUtils.jsonStringToObject() 方法报错。 // 只能转成JSON自定义解析反序列化。2022-11-15 // ObjectNode objectNode = JsonUtils.jsonStringToObjectNode(userJson); // return this.createUserPrincipal(objectNode); return UserUtils.toUserPrincipal(userJson); // return JsonUtils.jsonStringToObject(userJson, DefaultUserPrincipal.class); } catch (Exception e) { throw new RuntimeException("缓存获取登录信息错误, token=" + token + ", " + e.getMessage(), e); } // if(userPrincipal == null){ // logger.warn("UserOnlineProvider 缓存用户不存在, token = " + token); // return null; // } // return userPrincipal; } @Deprecated @Override public boolean cacheUserPrincipal(String token, UserPrincipal userPrincipal) { // logger.debug("redis写入登录用户缓存(token=uuid): " + token); // try { // String userJson = JsonUtils.objectToJsonString((DefaultUserPrincipal)userPrincipal); // this.putCacheData(token, userJson, TokenUtils.acquireCacheUserExpiredSeconds(VariableConstants.DEFAULT_TOKEN_EXPIRED_MINUTES)); // } catch (Exception e) { // throw new RuntimeException("登录信息写入缓存错误: " + e.getMessage(), e); // } // return true; return this.cacheUserPrincipal(token, userPrincipal, VariableConstants.DEFAULT_TOKEN_EXPIRED_MINUTES); } @Override public boolean cacheUserPrincipal(String token, UserPrincipal userPrincipal, long expiredMinutes) { logger.debug("redis写入登录用户缓存(token=uuid): " + token); try { String userJson = JsonUtils.objectToJsonString((DefaultUserPrincipal)userPrincipal); // logger.info(userJson); this.putCacheData(token, userJson, TokenUtils.acquireCacheUserExpiredSeconds(expiredMinutes)); } catch (Exception e) { throw new RuntimeException("登录信息写入缓存错误: " + e.getMessage(), e); } return true; } @Override public boolean updateUserPrincipalTimeStamp(String token) { return false; } @Override public boolean removeUserPrincipal(String token) { this.removeCacheData(token); return true; } /*private DefaultUserPrincipal createUserPrincipal(ObjectNode objectNode){ JsonNode userInfoNode = objectNode.get("userInfo"); S_user_core user_core = new S_user_core(); user_core.setId(userInfoNode.get("id").asLong()); user_core.setUser_name(userInfoNode.get("user_name").asText()); user_core.setPassword(userInfoNode.get("password").asText()); user_core.setDept_id(userInfoNode.get("dept_id").asLong()); user_core.setNick_name(userInfoNode.get("nick_name").asText()); user_core.setUser_type(userInfoNode.get("user_type").asInt()); user_core.setCreate_time(new Date(userInfoNode.get("create_time").asLong())); user_core.setOrg_id(userInfoNode.get("org_id").asLong()); user_core.setStatus(userInfoNode.get("status").asInt()); user_core.setDel_flag(userInfoNode.get("del_flag").asInt()); if(!JsonUtils.isEmptyObject(userInfoNode.get("sex"))){ user_core.setSex(userInfoNode.get("sex").asText()); } else { user_core.setSex("2"); } if(!JsonUtils.isEmptyObject(userInfoNode.get("phonenumber"))){ user_core.setPhonenumber(userInfoNode.get("phonenumber").asText()); } if(!JsonUtils.isEmptyObject(userInfoNode.get("avatar"))){ user_core.setAvatar(userInfoNode.get("avatar").asText()); } if(!JsonUtils.isEmptyObject(userInfoNode.get("email"))){ user_core.setEmail(userInfoNode.get("email").asText()); } if(!JsonUtils.isEmptyObject(userInfoNode.get("remark"))){ user_core.setRemark(userInfoNode.get("remark").asText()); } if(!JsonUtils.isEmptyObject(userInfoNode.get("create_by"))){ user_core.setCreate_by(userInfoNode.get("create_by").asText()); } if(!JsonUtils.isEmptyObject(userInfoNode.get("login_date"))){ user_core.setLogin_date(new Date(userInfoNode.get("login_date").asLong())); } if(!JsonUtils.isEmptyObject(userInfoNode.get("login_ip"))){ user_core.setLogin_ip(userInfoNode.get("login_ip").asText()); } if(!JsonUtils.isEmptyObject(userInfoNode.get("update_by"))){ user_core.setUpdate_by(userInfoNode.get("update_by").asText()); } if(!JsonUtils.isEmptyObject(userInfoNode.get("update_time"))){ user_core.setUpdate_time(new Date(userInfoNode.get("update_time").asLong())); } JsonNode roleIdListJson = objectNode.get("roleIdList"); List roleList = new ArrayList<>(4); if(roleIdListJson.isArray()){ for(Iterator it = roleIdListJson.iterator(); it.hasNext();){ roleList.add(it.next().asText()); } } DefaultUserPrincipal defaultUserPrincipal = new DefaultUserPrincipal(user_core); defaultUserPrincipal.setRoleIdList(roleList); // 2022-12-21 JsonNode dataScopeMap = objectNode.get("dataScopeMap"); if(dataScopeMap != null){ String functionMenuId = null; for(Iterator it = dataScopeMap.fieldNames(); it.hasNext();){ functionMenuId = it.next(); defaultUserPrincipal.addDataScope(functionMenuId, dataScopeMap.get(functionMenuId).asText()); } } return defaultUserPrincipal; }*/ }