add
This commit is contained in:
@ -24,5 +24,9 @@
|
||||
<groupId>com.qiaoba</groupId>
|
||||
<artifactId>qiaoba-common-datasource</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.qiaoba</groupId>
|
||||
<artifactId>qiaoba-api-monitor</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
</project>
|
||||
|
@ -0,0 +1,56 @@
|
||||
package com.qiaoba.module.monitor.controller;
|
||||
|
||||
import com.qiaoba.api.monitor.entity.SysLoginLog;
|
||||
import com.qiaoba.api.monitor.entity.param.LoginLogParam;
|
||||
import com.qiaoba.common.base.result.AjaxResult;
|
||||
import com.qiaoba.common.database.entity.PageQuery;
|
||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||
import com.qiaoba.common.poi.utils.ExcelUtil;
|
||||
import com.qiaoba.module.monitor.service.SysLoginLogService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 登录日志管理 Web层
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023-05-27 21:59:12
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/monitor/login-log")
|
||||
@RequiredArgsConstructor
|
||||
@Tag(name = "登录日志管理")
|
||||
public class SysLoginLogController {
|
||||
|
||||
private final SysLoginLogService sysLoginLogService;
|
||||
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "分页查询")
|
||||
@PreAuthorize("hasAuthority('monitor:login-log:list')")
|
||||
public TableDataInfo<SysLoginLog> list(LoginLogParam param, PageQuery pageQuery) {
|
||||
return sysLoginLogService.selectPageList(param, pageQuery);
|
||||
}
|
||||
|
||||
@PreAuthorize("hasAuthority('monitor:login-log:export')")
|
||||
@PostMapping("/export")
|
||||
@Operation(summary = "导出日志")
|
||||
public void export(HttpServletResponse response, LoginLogParam param) {
|
||||
List<SysLoginLog> list = sysLoginLogService.selectList(param);
|
||||
ExcelUtil.exportExcel(list, SysLoginLog.class, "登录日志", response);
|
||||
}
|
||||
|
||||
@PreAuthorize("hasAuthority('monitor:login-log:remove')")
|
||||
@DeleteMapping("/clean")
|
||||
@Operation(summary = "清空日志")
|
||||
public AjaxResult clean() {
|
||||
sysLoginLogService.cleanLoginLog();
|
||||
return AjaxResult.success();
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.qiaoba.module.monitor.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.qiaoba.api.monitor.entity.SysLoginLog;
|
||||
|
||||
/**
|
||||
* 登录日志 数据层
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/19 14:41
|
||||
*/
|
||||
public interface SysLoginLogMapper extends BaseMapper<SysLoginLog> {
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.qiaoba.module.monitor.service;
|
||||
|
||||
import com.qiaoba.api.monitor.entity.SysLoginLog;
|
||||
import com.qiaoba.api.monitor.entity.param.LoginLogParam;
|
||||
import com.qiaoba.api.monitor.service.SysLoginLogApiService;
|
||||
import com.qiaoba.common.database.entity.PageQuery;
|
||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 登录日志 服务层
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/19 15:52
|
||||
*/
|
||||
public interface SysLoginLogService extends SysLoginLogApiService {
|
||||
|
||||
/**
|
||||
* 分页查询
|
||||
*
|
||||
* @param param 查询参数
|
||||
* @param pageQuery 分页参数
|
||||
* @return page
|
||||
*/
|
||||
TableDataInfo<SysLoginLog> selectPageList(LoginLogParam param, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 清空日志
|
||||
*/
|
||||
void cleanLoginLog();
|
||||
|
||||
/**
|
||||
* 条件查询
|
||||
*
|
||||
* @param param param
|
||||
* @return list
|
||||
*/
|
||||
List<SysLoginLog> selectList(LoginLogParam param);
|
||||
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package com.qiaoba.module.monitor.service.impl;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.qiaoba.api.monitor.entity.SysLoginLog;
|
||||
import com.qiaoba.api.monitor.entity.param.LoginLogParam;
|
||||
import com.qiaoba.common.database.entity.PageQuery;
|
||||
import com.qiaoba.common.database.entity.TableDataInfo;
|
||||
import com.qiaoba.module.monitor.mapper.SysLoginLogMapper;
|
||||
import com.qiaoba.module.monitor.service.SysLoginLogService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 登录日志 服务层实现
|
||||
*
|
||||
* @author ailanyin
|
||||
* @version 1.0
|
||||
* @since 2023/6/19 14:39
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class SysLoginLogServiceImpl implements SysLoginLogService {
|
||||
|
||||
private final SysLoginLogMapper sysLoginLogMapper;
|
||||
|
||||
@Override
|
||||
public Integer insert(SysLoginLog sysLoginLog) {
|
||||
return sysLoginLogMapper.insert(sysLoginLog);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableDataInfo<SysLoginLog> selectPageList(LoginLogParam param, PageQuery pageQuery) {
|
||||
return TableDataInfo.build(sysLoginLogMapper.selectPage(pageQuery.build(), param2Wrapper(param)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cleanLoginLog() {
|
||||
sysLoginLogMapper.delete(new QueryWrapper<>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<SysLoginLog> selectList(LoginLogParam param) {
|
||||
return sysLoginLogMapper.selectList(param2Wrapper(param));
|
||||
}
|
||||
|
||||
private QueryWrapper<SysLoginLog> param2Wrapper(LoginLogParam param) {
|
||||
QueryWrapper<SysLoginLog> wrapper = new QueryWrapper<>();
|
||||
wrapper.lambda()
|
||||
.orderByAsc(SysLoginLog::getLoginTime)
|
||||
.ge(Objects.nonNull(param.getBeginTime()), SysLoginLog::getLoginTime, param.getBeginTime())
|
||||
.le(Objects.nonNull(param.getEndTime()), SysLoginLog::getLoginTime, param.getEndTime())
|
||||
.like(StrUtil.isNotBlank(param.getNickname()), SysLoginLog::getNickname, param.getNickname())
|
||||
.like(StrUtil.isNotBlank(param.getUsername()), SysLoginLog::getUsername, param.getUsername())
|
||||
.like(StrUtil.isNotBlank(param.getIp()), SysLoginLog::getIp, param.getIp());
|
||||
|
||||
return wrapper;
|
||||
}
|
||||
}
|
@ -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>
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user