This commit is contained in:
张良(004796)
2024-01-18 18:29:21 +08:00
parent fce0047b57
commit 3e5b7b9984
21 changed files with 768 additions and 28 deletions

View File

@@ -0,0 +1,37 @@
package com.ruoyi.cai.manager;
import com.ruoyi.cai.constant.RedisConstant;
import com.ruoyi.cai.domain.UserForbid;
import com.ruoyi.cai.enums.ForbidTypeEnum;
import com.ruoyi.cai.ws.util.MapGetUtil;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ForbidCache {
@Autowired
private RedissonClient redissonClient;
private String getKey(Integer type){
return String.format(RedisConstant.FORBID_CACHE_REDIS,type);
}
public void addForbid(UserForbid userForbid){
RMap<Object, Object> redisMap = redissonClient.getMap(getKey(userForbid.getType()));
redisMap.put(userForbid.getMember(),userForbid.getId());
}
public Long checkForbid(String member, ForbidTypeEnum forbidTypeEnum){
String key = getKey(forbidTypeEnum.getCode());
RMap<Object, Object> redisMap = redissonClient.getMap(key);
if(!redisMap.containsKey(member)){
return null;
}
Object o = redisMap.get(member);
return MapGetUtil.getLong(o);
}
}

View File

@@ -0,0 +1,134 @@
package com.ruoyi.cai.manager;
import com.alibaba.fastjson.JSON;
import com.ruoyi.cai.domain.ForbidFilter;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.domain.UserForbidLog;
import com.ruoyi.cai.dto.admin.UserForbidDTO;
import com.ruoyi.cai.enums.ForbidTimeEnum;
import com.ruoyi.cai.enums.ForbidTypeEnum;
import com.ruoyi.cai.service.ForbidFilterService;
import com.ruoyi.cai.service.UserForbidLogService;
import com.ruoyi.cai.service.UserForbidService;
import com.ruoyi.cai.service.UserService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.Serializable;
@Component
@Slf4j
public class UserForbidManager {
@Autowired
private UserForbidLogService userForbidLogService;
@Autowired
private UserForbidService userForbidService;
@Autowired
private UserService userService;
@Autowired
private ForbidCache forbidCache;
@Autowired
private ForbidFilterService forbidFilterService;
/**
* 封禁总入口
*/
public void forbid(UserForbidDTO userForbidDTO){
ForbidTimeEnum forbidTime = ForbidTimeEnum.getByCode(userForbidDTO.getForbidTime());
ForbidTypeEnum forbidType = ForbidTypeEnum.getByCode(userForbidDTO.getForbidType());
if(forbidTime == null || forbidType == null){
log.error("封禁入参错误 data={}", JSON.toJSONString(userForbidDTO));
return;
}
User user = null;
if(forbidType == ForbidTypeEnum.USER){
user = userService.getById(userForbidDTO.getMember());
if(user == null){
return;
}
}
UserForbidLog userForbidLog = new UserForbidLog();
userForbidLog.setType(userForbidDTO.getForbidType());
userForbidLog.setMember(userForbidDTO.getMember());
userForbidLog.setForbidTime(userForbidDTO.getForbidTime());
userForbidLog.setReason(userForbidDTO.getRemark());
userForbidLogService.save(userForbidLog);
userForbidService.forbid(userForbidLog,user);
}
public CheckForbid checkForbid(Long userId,String IMEI,String ip){
ForbidTypeEnum typeEnum;
CheckForbid noForbid = CheckForbid.noForbid();
String member;
Long forbidId;
if(userId != null){
forbidId = forbidCache.checkForbid(userId + "", ForbidTypeEnum.USER);
if(forbidId == null){
return noForbid;
}
member = userId+"";
typeEnum = ForbidTypeEnum.USER;
String traceId = IdManager.nextIdStr();
noForbid = CheckForbid.forbid(traceId);
noForbid.setMessage("您的账号已被封禁");
}else if(IMEI != null){
forbidId = forbidCache.checkForbid(IMEI, ForbidTypeEnum.IMEI);
if(forbidId == null){
return noForbid;
}
member = IMEI;
typeEnum = ForbidTypeEnum.IMEI;
String traceId = IdManager.nextIdStr();
noForbid = CheckForbid.forbid(traceId);
noForbid.setMessage("您的设备已被封禁");
}else if(ip != null){
forbidId = forbidCache.checkForbid(ip, ForbidTypeEnum.IP);
if(forbidId == null){
return noForbid;
}
member = ip;
typeEnum = ForbidTypeEnum.IP;
String traceId = IdManager.nextIdStr();
noForbid = CheckForbid.forbid(traceId);
noForbid.setMessage("您的IP已被封禁");
}else{
return noForbid;
}
if(noForbid.isForbid()){
// 保存拦截记录
ForbidFilter filter = new ForbidFilter();
filter.setType(typeEnum.getCode());
filter.setMember(member);
filter.setUserId(userId);
filter.setTraceNo(noForbid.getTraceId());
filter.setForbidId(forbidId);
filter.setFilterReason(noForbid.getMessage());
forbidFilterService.addForbidFilter(filter);
}
return noForbid;
}
@Data
public static class CheckForbid implements Serializable {
// 是否已经被封禁
private boolean forbid = false;
private String traceId;
private String message;
public static CheckForbid noForbid(){
return new CheckForbid();
}
public static CheckForbid forbid(String traceId){
CheckForbid checkForbid = new CheckForbid();
checkForbid.setForbid(true);
checkForbid.setTraceId(traceId);
return checkForbid;
}
}
}