first commit

This commit is contained in:
2023-05-28 16:33:27 +08:00
parent b01b6df882
commit d35ea18db8
22 changed files with 465 additions and 266 deletions

View File

@ -1,6 +1,8 @@
package com.qiaoba.module.monitor.controller;
import com.qiaoba.auth.entity.OnlineUser;
import com.qiaoba.auth.service.OnlineUserService;
import com.qiaoba.common.base.entity.BasePage;
import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.common.database.entity.TableDataInfo;
import io.swagger.v3.oas.annotations.Operation;
@ -9,6 +11,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
/**
* 在线用户管理 Web层
*
@ -27,7 +30,7 @@ public class OnlineUserController {
@PreAuthorize("hasAuthority('monitor:online:list')")
@Operation(summary = "获取列表")
@GetMapping("/list")
public TableDataInfo getList(String username) {
public BasePage<OnlineUser> getList(String username) {
return TableDataInfo.build(onlineUserService.selectList(username));
}
@ -35,7 +38,7 @@ public class OnlineUserController {
@DeleteMapping("/{username}/{deviceSn}")
@Operation(summary = "强退用户")
public AjaxResult forceLogout(@PathVariable String username, @PathVariable String deviceSn) {
onlineUserService.deleteOne(username, deviceSn);
onlineUserService.deleteOne(username, deviceSn, false);
return AjaxResult.success();
}
}

View File

@ -8,14 +8,16 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
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.system.entity.SysUser;
import com.qiaoba.api.system.entity.dto.LoginDto;
import com.qiaoba.api.auth.service.SysUserDetailsApiService;
import com.qiaoba.auth.constants.SecurityConstant;
import com.qiaoba.auth.entity.OnlineUser;
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.enums.BaseEnum;
import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.common.redis.service.RedisService;
@ -46,13 +48,15 @@ public class SysLoginServiceImpl implements SysLoginService {
private final SysUserDetailsApiService userDetailsService;
private final SysUserService sysUserService;
private final OnlineUserService onlineUserService;
private final AuthConfigApiService authConfigApiService;
@Override
public Map<String, Object> getCaptchaImage() {
Map<String, Object> map = new HashMap<String, Object>(4);
map.put("register", getRegisterConfig());
if (!getCaptchaConfig()) {
map.put("register", authConfigApiService.getRegisterConfig());
if (!authConfigApiService.getCaptchaConfig()) {
map.put("captchaEnabled", false);
return map;
}
@ -69,7 +73,7 @@ public class SysLoginServiceImpl implements SysLoginService {
@Override
public String login(LoginDto dto) {
// 校验验证码
validateCaptcha(dto.getCode(), dto.getUuid());
authConfigApiService.validateCaptcha(dto.getCode(), dto.getUuid());
// username查询用户信息
SysUser sysUser = sysUserService.selectByUsername(dto.getUsername());
// 检查账号信息
@ -81,7 +85,7 @@ public class SysLoginServiceImpl implements SysLoginService {
// 缓存userDetails
userDetailsService.toCache(sysUser.getUsername(), deviceSn);
// 生成Token
return dto.getUsername() + ":" + deviceSn;
return TokenUtil.generateToken(sysUser.getUsername(), deviceSn);
}
private void validatePassword(String username, String password, String inputPassword) {
@ -104,52 +108,20 @@ public class SysLoginServiceImpl implements SysLoginService {
}
}
private boolean getCaptchaConfig() {
try {
return SecurityConstant.CAPTCHA_ON.equals(redisService.get(SecurityConstant.CAPTCHA_ON_OFF_KEY));
} catch (Exception e) {
throw new ServiceException("Redis中验证码配置不存在");
}
}
private boolean getRegisterConfig() {
try {
return SecurityConstant.REGISTER_ON.equals(redisService.get(SecurityConstant.REGISTER_ON_OFF_KEY));
} catch (Exception e) {
throw new ServiceException("Redis中注册配置不存在");
}
}
private void validateCaptcha(String code, String uuid) {
if (getCaptchaConfig()) {
if (StrUtil.isBlank(code) || StrUtil.isBlank(uuid)) {
throw new ServiceException("验证码或uuid获取失败");
}
try {
if (!redisService.hasKey(SecurityConstant.CAPTCHA_KEY + uuid)) {
throw new ServiceException("验证码已经过期失效!");
} else {
if (!code.equalsIgnoreCase(redisService.get(SecurityConstant.CAPTCHA_KEY + uuid).toString())) {
throw new ServiceException("验证码输入错误!");
}
}
} finally {
redisService.del(SecurityConstant.CAPTCHA_KEY + uuid);
}
}
}
private String cacheOnlineUser(String username, String nickname) {
String deviceSn = UUID.fastUUID().toString(true);
String ip = IpUtil.getIp(request);
String address = IpUtil.getIpAddr(ip);
UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
String browser = userAgent.getBrowser().getName() + userAgent.getVersion();
String browser = userAgent.getBrowser().getName() + BaseConstant.LINE_JOIN_STR + userAgent.getVersion();
String os = userAgent.getOs().getName();
redisService.set(SecurityConstant.LOGGED_USER_REDIS_KEY + username, deviceSn, TokenUtil.expireTime * 3600);
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;
}
}