package com.yami.trading.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yami.trading.bean.model.HighLevelAuthRecord; import com.yami.trading.bean.model.IpMenu; import com.yami.trading.common.constants.DdosRedisKeys; import com.yami.trading.common.util.BlacklistIpSerivceTimeWindow; import com.yami.trading.common.util.DateUtils; import com.yami.trading.common.util.LocklistIpSerivceTimeWindow; import com.yami.trading.dao.IpMenuMapper; import com.yami.trading.dao.user.HighLevelAuthRecordMapper; import com.yami.trading.service.IpMenuService; import lombok.Data; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; @Service public class IpMenuServiceImpl extends ServiceImpl implements IpMenuService, InitializingBean { @Autowired private LocklistIpSerivceTimeWindow locklistIpSerivceTimeWindow; @Autowired private BlacklistIpSerivceTimeWindow blacklistIpSerivceTimeWindow; @Autowired private RedisTemplate redisTemplate; public void init() { List list = list(Wrappers.query().lambda().eq(IpMenu::getDeleteStatus,0));; for (IpMenu ipMenu : list) { if (DateUtils.addHour(ipMenu.getLastOperaTime(), 24).after(new Date())) { // 黑名单 时间+1天>现在 switch (ipMenu.getType()) { case IpMenu.IP_BLACK: blacklistIpSerivceTimeWindow.putBlackIp(ipMenu.getIp(), ipMenu.getIp()); break; case IpMenu.IP_LOCK: locklistIpSerivceTimeWindow.putLockIp(ipMenu.getIp(), ipMenu.getIp()); break; } } else { checkTimeWindows(ipMenu); ipMenu.setDeleteStatus(-1); redisTemplate.opsForValue().set(DdosRedisKeys.IP_MENU_IP + ipMenu.getIp(), ipMenu); } } } @Override public void saveIpMenu(IpMenu entity) { if(null==entity) return; checkTimeWindows(entity); save(entity); redisTemplate.opsForValue().set(DdosRedisKeys.IP_MENU_IP + entity.getIp(), entity); } @Override public void updateIpMenu(IpMenu entity) { if(null==entity) return; checkTimeWindows(entity); updateById(entity); redisTemplate.opsForValue().set(DdosRedisKeys.IP_MENU_IP + entity.getIp(), entity); } @Override public void deleteIpMenu(IpMenu entity) { if(null==entity) return; removeById(entity); redisTemplate.delete(DdosRedisKeys.IP_MENU_IP +entity.getIp()); } @Override public IpMenu cacheByIp(String ip) { return (IpMenu) redisTemplate.opsForValue().get(DdosRedisKeys.IP_MENU_IP + ip); } /** * 新增ip到白名单 * @param ip */ public void saveIpMenuWhite(String ip) { IpMenu ipMenu = this.cacheByIp(ip); if (null == ipMenu) { ipMenu = new IpMenu(); ipMenu.setCreateTime(new Date()); ipMenu.setDeleteStatus(0); ipMenu.setLastOperaTime(new Date()); ipMenu.setType(IpMenu.IP_WHITE); ipMenu.setIp(ip); saveIpMenu(ipMenu); } else if (ipMenu.getDeleteStatus() == -1 || !IpMenu.IP_WHITE.equals(ipMenu.getType())) {// 名单被删除或者不是白名单 ipMenu.setDeleteStatus(0); ipMenu.setLastOperaTime(new Date()); ipMenu.setType(IpMenu.IP_WHITE); updateIpMenu(ipMenu); } } public void checkTimeWindows(IpMenu entity) { if (entity.getDeleteStatus() == -1) { blacklistIpSerivceTimeWindow.delBlackIp(entity.getIp()); locklistIpSerivceTimeWindow.delLockIp(entity.getIp()); return; } switch (entity.getType()) { case IpMenu.IP_WHITE: if (blacklistIpSerivceTimeWindow.getBlackIp(entity.getIp()) != null) {// 白名单直接删除黑名单缓存 blacklistIpSerivceTimeWindow.delBlackIp(entity.getIp()); } if (locklistIpSerivceTimeWindow.getLockIp(entity.getIp()) != null) {// 白名单直接删除锁定名单缓存 locklistIpSerivceTimeWindow.delLockIp(entity.getIp()); } break; case IpMenu.IP_BLACK: if (locklistIpSerivceTimeWindow.getLockIp(entity.getIp()) != null) {// 删除锁定名单缓存 locklistIpSerivceTimeWindow.delLockIp(entity.getIp()); } blacklistIpSerivceTimeWindow.putBlackIp(entity.getIp(), entity.getIp()); break; case IpMenu.IP_LOCK: if (blacklistIpSerivceTimeWindow.getBlackIp(entity.getIp()) != null) {// 删除黑名单缓存 blacklistIpSerivceTimeWindow.delBlackIp(entity.getIp()); } locklistIpSerivceTimeWindow.putLockIp(entity.getIp(), entity.getIp()); break; } } @Override public void afterPropertiesSet() throws Exception { init(); } }