|
|
@@ -26,6 +26,7 @@ import com.storlead.sms.spi.SmsLogService;
|
|
|
import com.storlead.system.pojo.entity.MenuEntity;
|
|
|
import com.storlead.system.service.IMenuService;
|
|
|
import com.storlead.system.service.IUserRoleService;
|
|
|
+import com.storlead.system.service.SysLoginLogService;
|
|
|
import com.storlead.system.util.SystemConfigItemCacheUtil;
|
|
|
import com.storlead.user.pojo.dto.UserLoginDTO;
|
|
|
import com.storlead.user.pojo.entity.DeptEntity;
|
|
|
@@ -95,6 +96,9 @@ public class LoginApiController {
|
|
|
@Resource
|
|
|
private CorpWeChatService corpWeChatService;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private SysLoginLogService loginLogService;
|
|
|
+
|
|
|
@PostMapping(value = "/redirect")
|
|
|
@ResponseBody
|
|
|
public Object redirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
|
|
@@ -107,9 +111,10 @@ public class LoginApiController {
|
|
|
public Result login(@RequestBody UserLoginDTO loginDTO) {
|
|
|
|
|
|
if (Objects.isNull(loginDTO)) {
|
|
|
- return Result.error("参数错误");
|
|
|
+ return loginFail(null, null, "参数错误");
|
|
|
}
|
|
|
- UserEntity userInfo;
|
|
|
+ String account = StrUtil.trimToEmpty(loginDTO.getAccount());
|
|
|
+ UserEntity userInfo = null;
|
|
|
JSONObject obj = new JSONObject();
|
|
|
if (StrUtil.isNotBlank(loginDTO.getWxCode())) {
|
|
|
String code = corpWeChatService.login(loginDTO.getWxCode());
|
|
|
@@ -118,28 +123,28 @@ public class LoginApiController {
|
|
|
String mobile = StrUtil.trimToEmpty(loginDTO.getAccount());
|
|
|
String smsCode = StrUtil.trimToEmpty(loginDTO.getSmsCode());
|
|
|
if (StrUtil.isBlank(mobile)) {
|
|
|
- return Result.error("请输入手机号");
|
|
|
+ return loginFail(account, null, "请输入手机号");
|
|
|
}
|
|
|
if (StrUtil.isBlank(smsCode)) {
|
|
|
- return Result.error("请输入验证码");
|
|
|
+ return loginFail(account, null, "请输入验证码");
|
|
|
}
|
|
|
Result<?> vr = smsCaptchaService.verifyCaptcha(mobile, smsCode, SmsCaptchaScene.LOGIN, true);
|
|
|
if (!vr.isSuccess()) {
|
|
|
- return Result.error(vr.getCode(), vr.getMessage());
|
|
|
+ return loginFail(account, null, vr.getMessage());
|
|
|
}
|
|
|
userInfo = sysUserService.getOne(new LambdaQueryWrapper<UserEntity>()
|
|
|
.eq(UserEntity::getMobile, mobile)
|
|
|
.eq(UserEntity::getIsDelete, CommonConstant.DEL_FLAG_0));
|
|
|
if (userInfo == null) {
|
|
|
- return Result.error("该手机号未绑定用户或账号已删除");
|
|
|
+ return loginFail(account, null, "该手机号未绑定用户或账号已删除");
|
|
|
}
|
|
|
} else {
|
|
|
if (StrUtil.isBlank(loginDTO.getAccount()) || StrUtil.isBlank(loginDTO.getPassword())) {
|
|
|
- return Result.error("用户名或密码为空");
|
|
|
+ return loginFail(account, null, "用户名或密码为空");
|
|
|
}
|
|
|
userInfo = sysUserService.getOne(new LambdaQueryWrapper<UserEntity>().eq(UserEntity::getMobile,loginDTO.getAccount()).eq(UserEntity::getIsDelete, CommonConstant.DEL_FLAG_0));
|
|
|
if (Objects.isNull(userInfo)) {
|
|
|
- return Result.error("账号不存在");
|
|
|
+ return loginFail(account, null, "账号不存在");
|
|
|
}
|
|
|
|
|
|
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
|
|
|
@@ -148,14 +153,14 @@ public class LoginApiController {
|
|
|
try {
|
|
|
password = RsaUtils.decryptByPrivateKey(RsaUtils.PRIVATE_KEY, loginDTO.getPassword());
|
|
|
}catch (Exception e) {
|
|
|
- return Result.error("用户名或密码错误");
|
|
|
+ return loginFail(account, userInfo, "用户名或密码错误");
|
|
|
}
|
|
|
}
|
|
|
if(environment.equals("prod") || (environment.equals("test")
|
|
|
&& !loginDTO.getPassword().equals("qq123456") &&
|
|
|
!password.equals("qq123456"))) {
|
|
|
if (!bCryptPasswordEncoder.matches(password, userInfo.getPassword())) {
|
|
|
- return Result.error("用户名或密码错误");
|
|
|
+ return loginFail(account, userInfo, "用户名或密码错误");
|
|
|
}
|
|
|
}
|
|
|
String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z\\W]{8,}$";
|
|
|
@@ -170,16 +175,16 @@ public class LoginApiController {
|
|
|
}
|
|
|
|
|
|
if (Objects.isNull(userInfo)) {
|
|
|
- return Result.error("登录失败,未获取到用户信息");
|
|
|
+ return loginFail(account, null, "登录失败,未获取到用户信息");
|
|
|
}
|
|
|
|
|
|
if (!userInfo.getEnabled()) {
|
|
|
- return Result.error("该账号用户暂无登录权限");
|
|
|
+ return loginFail(account, userInfo, "该账号用户暂无登录权限");
|
|
|
}
|
|
|
|
|
|
Integer possessMenuCount = menuService.checkUserMenuAccess(userInfo.getId());
|
|
|
if (possessMenuCount == 0) {
|
|
|
- return Result.error("暂未获取到菜单权限,请联系管理员分配权限!");
|
|
|
+ return loginFail(account, userInfo, "暂未获取到菜单权限,请联系管理员分配权限!");
|
|
|
}
|
|
|
|
|
|
LoginUser loginUser = new LoginUser();
|
|
|
@@ -212,6 +217,10 @@ public class LoginApiController {
|
|
|
redisService.setCacheObject(RedisKeySaltConstant.API_CODE_REDIS + loginUser.getMobile(), apiMap);
|
|
|
|
|
|
obj.put("token", token);
|
|
|
+ loginLogService.recordLoginSuccess(userInfo.getId(),
|
|
|
+ StrUtil.blankToDefault(account, userInfo.getMobile()),
|
|
|
+ userInfo.getUserName(),
|
|
|
+ userInfo.getRealName());
|
|
|
return Result.result(obj);
|
|
|
}
|
|
|
|
|
|
@@ -317,17 +326,27 @@ public class LoginApiController {
|
|
|
public Result<Object> logout(HttpServletRequest request) {
|
|
|
//用户退出逻辑
|
|
|
String token = request.getHeader(DefContants.ACCESS_TOKEN);
|
|
|
+ LoginUser loginUser = LoginUserUtil.getLoginUser();
|
|
|
+ Long userId = loginUser != null ? loginUser.getId() : null;
|
|
|
+ String account = loginUser != null ? loginUser.getMobile() : null;
|
|
|
+ String userName = loginUser != null ? loginUser.getUserName() : null;
|
|
|
+ String realName = loginUser != null ? loginUser.getRealName() : null;
|
|
|
+
|
|
|
if(ConvertUtils.isEmpty(token)) {
|
|
|
+ loginLogService.recordLogoutFail(userId, account, userName, realName, "退出登录失败!");
|
|
|
return Result.error("退出登录失败!");
|
|
|
}
|
|
|
Boolean del = redisService.deleteObject(token);
|
|
|
if (del) {
|
|
|
+ loginLogService.recordLogoutSuccess(userId, account, userName, realName);
|
|
|
return Result.result("退出登录成功!");
|
|
|
} else {
|
|
|
Object obj = redisService.getCacheObject(token);
|
|
|
if (obj == null) {
|
|
|
+ loginLogService.recordLogoutSuccess(userId, account, userName, realName);
|
|
|
return Result.error("退出登录成功!");
|
|
|
}
|
|
|
+ loginLogService.recordLogoutFail(userId, account, userName, realName, "退出登录失败!");
|
|
|
return Result.error("退出登录失败!");
|
|
|
}
|
|
|
}
|
|
|
@@ -585,4 +604,12 @@ public class LoginApiController {
|
|
|
// log.error("InvalidKeyException -- error--",e);
|
|
|
// }
|
|
|
// }
|
|
|
+
|
|
|
+ private Result loginFail(String account, UserEntity user, String message) {
|
|
|
+ Long userId = user != null ? user.getId() : null;
|
|
|
+ String userName = user != null ? user.getUserName() : null;
|
|
|
+ String realName = user != null ? user.getRealName() : null;
|
|
|
+ loginLogService.recordLoginFail(account, userId, userName, realName, message);
|
|
|
+ return Result.error(message);
|
|
|
+ }
|
|
|
}
|