package com.fzzy.sys;
|
|
import com.fzzy.api.utils.ContextUtil;
|
import com.fzzy.sys.entity.LogLogin;
|
import com.fzzy.api.utils.RedisConst;
|
import com.fzzy.api.utils.RedisUtil;
|
import com.fzzy.api.utils.SystemUtil;
|
import com.fzzy.sys.repository.LogLoginRep;
|
import com.fzzy.sys.entity.SysUser;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.Date;
|
|
/**
|
* @Desc: 登陆日志记录信息
|
* @author: andy.jia
|
* @update-time: 2023/4/28 8:32
|
*/
|
@Component
|
public class LogLoginService{
|
|
private String KEY_LOGON_LOG = "LOGIN_LOG";
|
private int TIME_ERROR_MIN = 60;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
@Autowired
|
private LogLoginRep logLoginRep;
|
|
/**
|
* 判断当前登陆是否被限制
|
*
|
* @param request
|
* @param username
|
* @return
|
*/
|
public int checkLoginLimit(HttpServletRequest request, String username) {
|
|
//获取错误记录缓存
|
LogLogin errorLog = this.getFromCacheError(username, SystemUtil.getIP(request));
|
|
if (null == errorLog) return 0;
|
|
return errorLog.getErrorNum();
|
}
|
|
|
/**
|
* 密码输入错误记录,返回输入错误次数
|
*
|
* @param request
|
* @param user
|
* @return
|
*/
|
public int addPwdError(HttpServletRequest request, SysUser user) {
|
LogLogin log = new LogLogin();
|
log.setCompanyId(user.getCompanyId());
|
log.setLoginId(user.getUsername());
|
log.setLoginName(user.getName());
|
log.setLoginTime(new Date());
|
log.setIp(SystemUtil.getIP(request));
|
log.setBrowser(SystemUtil.getBrowserInfo(request));
|
log.setSysName(SystemUtil.getSystemInfo(request));
|
log.setHostName(SystemUtil.getHostName(log.getIp()));
|
log.setLastLoginTime(new Date());
|
log.setErrorNum(1);
|
log.setLoginInfo("失败:密码错误");
|
|
// 获取上次错误记录
|
LogLogin errorLog = this.getFromCacheError(user.getUsername(), log.getIp());
|
if (null != errorLog) {
|
log.setErrorNum(errorLog.getErrorNum() + 1);
|
}
|
|
//保存日志
|
addLog(log);
|
|
//保存到缓存
|
addToCacheError(log);
|
|
return log.getErrorNum();
|
}
|
|
|
/**
|
* 登陆用户不存在错误,返回输入不存在账号次数,用户不存在的账号,使用IP作为判断标准,避免恶意尝试
|
*
|
* @param request
|
* @param username
|
* @return
|
*/
|
public int addNoUser(HttpServletRequest request, String username) {
|
|
LogLogin log = new LogLogin();
|
log.setLoginName(username);
|
log.setLoginTime(new Date());
|
log.setIp(SystemUtil.getIP(request));
|
log.setBrowser(SystemUtil.getBrowserInfo(request));
|
log.setSysName(SystemUtil.getSystemInfo(request));
|
log.setHostName(SystemUtil.getHostName(log.getIp()));
|
log.setLastLoginTime(new Date());
|
log.setErrorNum(1);
|
log.setLoginId(log.getIp());
|
log.setLoginInfo("失败:无效账号");
|
|
// 获取上次错误记录
|
LogLogin errorLog = this.getFromCacheError(log.getIp(), log.getIp());
|
if (null != errorLog) {
|
log.setErrorNum(errorLog.getErrorNum() + 1);
|
}
|
|
//保存到缓存
|
addToCache(log);
|
|
|
//保存日志
|
log.setLoginId(username);
|
addLog(log);
|
|
return log.getErrorNum();
|
}
|
|
/**
|
* 增加登陆日志信息
|
*
|
* @param request
|
* @param user
|
*/
|
public void addLoginInfo(HttpServletRequest request, SysUser user) {
|
LogLogin log = new LogLogin();
|
log.setCompanyId(user.getCompanyId());
|
log.setLoginId(user.getUsername());
|
log.setLoginName(user.getName());
|
log.setLoginTime(new Date());
|
log.setIp(SystemUtil.getIP(request));
|
log.setBrowser(SystemUtil.getBrowserInfo(request));
|
log.setSysName(SystemUtil.getSystemInfo(request));
|
log.setHostName(SystemUtil.getHostName(log.getIp()));
|
log.setErrorNum(0);
|
log.setLoginInfo("成功:正常登陆");
|
|
// 获取上次登陆信息
|
LogLogin lastLog = this.getFromCache(log.getLoginId());
|
if (null != lastLog) {
|
log.setLastLoginTime(lastLog.getLoginTime());
|
}
|
|
//保存缓存
|
addToCache(log);
|
|
//保存日志
|
addLog(log);
|
}
|
|
/**
|
* @param log
|
*/
|
private void addToCache(LogLogin log) {
|
|
String key = RedisConst.buildKey(KEY_LOGON_LOG, log.getLoginId());
|
|
redisUtil.set(key, log);
|
|
|
this.removeCacheError(log.getLoginId(), log.getIp());
|
|
}
|
|
|
private LogLogin getFromCache(String loginId) {
|
if (null == loginId) return null;
|
try {
|
String key = RedisConst.buildKey(KEY_LOGON_LOG, loginId);
|
return (LogLogin) redisUtil.get(key);
|
} catch (Exception e) {
|
return null;
|
}
|
}
|
|
private void removeCacheError(String loginId, String ip) {
|
String key = RedisConst.buildKey(KEY_LOGON_LOG, loginId, ip);
|
|
redisUtil.del(key);
|
}
|
|
private void addToCacheError(LogLogin log) {
|
String key = RedisConst.buildKey(KEY_LOGON_LOG, log.getLoginId(), log.getIp());
|
redisUtil.set(key, log, (TIME_ERROR_MIN + 1) * 60);
|
}
|
|
private LogLogin getFromCacheError(String loginId, String ip) {
|
if (null == loginId) return null;
|
if (null == ip) return null;
|
try {
|
String key = RedisConst.buildKey(KEY_LOGON_LOG, loginId, ip);
|
return (LogLogin) redisUtil.get(key);
|
} catch (Exception e) {
|
return null;
|
}
|
}
|
|
|
/**
|
* @Desc: 保存日志
|
* @author: Andy
|
* @update-time: 2023/4/28
|
*/
|
public void addLog(LogLogin log) {
|
|
if (null == log) return;
|
|
if (null == log.getId()) {
|
log.setId(ContextUtil.getUUID());
|
}
|
logLoginRep.save(log);
|
}
|
|
}
|