This commit is contained in:
2023-06-19 17:27:38 +08:00
parent 5aad8dc823
commit 549819f751
16 changed files with 446 additions and 16 deletions

View File

@ -24,5 +24,9 @@
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-api-file</artifactId>
</dependency>
<dependency>
<groupId>com.qiaoba</groupId>
<artifactId>qiaoba-api-monitor</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -2,6 +2,7 @@ package com.qiaoba.module.system.service.impl;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
@ -9,6 +10,8 @@ import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import com.qiaoba.api.auth.service.AuthConfigApiService;
import com.qiaoba.api.auth.service.SysUserDetailsApiService;
import com.qiaoba.api.monitor.entity.SysLoginLog;
import com.qiaoba.api.monitor.service.SysLoginLogApiService;
import com.qiaoba.api.system.entity.SysUser;
import com.qiaoba.api.system.entity.dto.LoginDto;
import com.qiaoba.auth.constants.SecurityConstant;
@ -17,6 +20,7 @@ import com.qiaoba.auth.service.OnlineUserService;
import com.qiaoba.auth.utils.SecurityUtil;
import com.qiaoba.auth.utils.TokenUtil;
import com.qiaoba.common.base.constants.BaseConstant;
import com.qiaoba.common.base.constants.ConfigConstant;
import com.qiaoba.common.base.enums.BaseEnum;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.common.redis.service.RedisService;
@ -49,7 +53,7 @@ public class SysLoginServiceImpl implements SysLoginService {
private final SysUserService sysUserService;
private final OnlineUserService onlineUserService;
private final AuthConfigApiService authConfigApiService;
private final SysLoginLogApiService sysLoginLogApiService;
@Override
public Map<String, Object> getCaptchaImage() {
@ -84,11 +88,13 @@ public class SysLoginServiceImpl implements SysLoginService {
// 检验密码
validatePassword(blacklistSwitch, dto.getUsername(), sysUser.getPassword(), dto.getPassword());
// 缓存在线用户
String deviceSn = cacheOnlineUser(dto.getUsername(), sysUser.getNickname());
OnlineUser onlineUser = cacheOnlineUser(dto.getUsername(), sysUser.getNickname());
// 缓存userDetails
userDetailsService.toCache(sysUser.getUsername(), deviceSn);
userDetailsService.toCache(sysUser.getUsername(), onlineUser.getDeviceSn());
// 新增登录日志
addLoginLog(onlineUser);
// 生成Token
return TokenUtil.generateToken(sysUser.getUsername(), deviceSn);
return TokenUtil.generateToken(sysUser.getUsername(), onlineUser.getDeviceSn());
}
private void validateBlacklist(Boolean blacklistSwitch) {
@ -100,10 +106,14 @@ public class SysLoginServiceImpl implements SysLoginService {
private void validatePassword(Boolean blacklistSwitch, String username, String password, String inputPassword) {
boolean result = SecurityUtil.matchesPassword(inputPassword, password);
if (result && blacklistSwitch) {
// 密码正确, 删除错误次数
String ip = IpUtil.getIp(request);
redisService.del(SecurityConstant.LOGIN_ERROR_COUNT + ip);
// 密码正确
if (result) {
if (blacklistSwitch) {
// 删除错误次数
String ip = IpUtil.getIp(request);
redisService.del(SecurityConstant.LOGIN_ERROR_COUNT + ip);
}
} else {
// 密码错误
String msg = beforePasswordError(blacklistSwitch, username);
@ -149,7 +159,7 @@ public class SysLoginServiceImpl implements SysLoginService {
}
private String cacheOnlineUser(String username, String nickname) {
private OnlineUser cacheOnlineUser(String username, String nickname) {
String deviceSn = UUID.fastUUID().toString(true);
String ip = IpUtil.getIp(request);
String address = IpUtil.getIpAddr(ip);
@ -160,8 +170,17 @@ public class SysLoginServiceImpl implements SysLoginService {
if (!authConfigApiService.checkAllowBothOnline()) {
redisService.set(SecurityConstant.LOGGED_USER_REDIS_KEY + username, deviceSn, TokenUtil.expireTime * 3600);
}
onlineUserService.insert(new OnlineUser(deviceSn, username, nickname, ip, address, browser, os, new Date()));
return deviceSn;
OnlineUser onlineUser = new OnlineUser(deviceSn, username, nickname, ip, address, browser, os, new Date());
onlineUserService.insert(onlineUser);
return onlineUser;
}
private void addLoginLog(OnlineUser onlineUser) {
// 查询系统配置 - 是否开启登录日志
String onOff = redisService.getObject(ConfigConstant.LOGIN_LOG_ON_OFF_KEY, String.class);
if (ConfigConstant.COMMON_ON_VALUE.equals(onOff)) {
SysLoginLog sysLoginLog = BeanUtil.copyProperties(onlineUser, SysLoginLog.class);
sysLoginLogApiService.insert(sysLoginLog);
}
}
}