app用户登录

This commit is contained in:
liang.chao 2025-04-17 09:47:40 +08:00
parent 55b3d0ab29
commit dc10e56fe0
1 changed files with 174 additions and 0 deletions

View File

@ -0,0 +1,174 @@
package com.bonus.imgTool.system.controller;
import com.bonus.imgTool.annotation.DecryptAndVerify;
import com.bonus.imgTool.annotation.LogAnnotation;
import com.bonus.imgTool.backstage.entity.QueryParamDto;
import com.bonus.imgTool.model.Permission;
import com.bonus.imgTool.model.SysLogs;
import com.bonus.imgTool.model.SysUser;
import com.bonus.imgTool.system.dao.PermissionDao;
import com.bonus.imgTool.system.dao.SysConfigDao;
import com.bonus.imgTool.system.dao.SysLogsDao;
import com.bonus.imgTool.system.dao.UserDao;
import com.bonus.imgTool.system.service.TokenService;
import com.bonus.imgTool.system.service.UserService;
import com.bonus.imgTool.system.vo.*;
import com.bonus.imgTool.utils.*;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException;
import org.springframework.security.authentication.DisabledException;
import org.springframework.security.authentication.LockedException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/**
* @Authorliang.chao
* @Date2025/4/16 - 16:45
*/
@RestController
@RequestMapping("/loginApp")
@Slf4j
public class LoginController {
@Resource
private UserService userService;
@Resource
private RedisUtil redisUtil;
@Resource
private PermissionDao permissionDao;
@Resource
private SysConfigDao sysConfigDao;
@Resource
private SysLogsDao sysLogsDao;
@Resource
private UserDao userDao;
@Autowired
private TokenService tokenService;
@Autowired
private BCryptPasswordEncoder passwordEncoder;
@ApiOperation("APP登录")
@PostMapping
@DecryptAndVerify(decryptedClass = UserDto.class)
public Token loginApp(EncryptedReq<UserDto> user) {
String userName = user.getData().getUsername();
String passWord = user.getData().getPassword();
SysUser sysUser = userService.getUser(userName);
if (sysUser != null && !passwordEncoder.matches(passWord, sysUser.getPassword())) {
throw new AuthenticationCredentialsNotFoundException("用户名/密码错误!");
}
userConfig(sysUser);
LoginUser loginUser = new LoginUser();
BeanUtils.copyProperties(sysUser, loginUser);
List<Permission> permissions = permissionDao.listByUserId(sysUser.getId());
loginUser.setPermissions(permissions);
Token token = tokenService.saveToken(loginUser);
saveLogs(loginUser, "成功", "登录成功");
userDao.updateLoginTime(loginUser);
redisUtil.set(RedisPerfixUtil.USER_STATE + ":" + loginUser.getLoginName(), "1", 60 * 5);
return token;
}
public void userConfig(SysUser user) {
if (user == null) {
throw new AuthenticationCredentialsNotFoundException("用户名/密码错误!");
}
long num = 0L;
try {
num = redisUtil.countKeys();//在线用户
} catch (Exception e) {
throw new LockedException("redis未连接,请检查服务!");
}
SysConfigVo sysConfigVo0 = sysConfigDao.getSysConfigByCode("sys_user_concurrency");//并发
String nums = sysConfigVo0.getSystemValue();
if (num > Integer.parseInt(nums)) {
throw new LockedException("系统繁忙,请稍后重试");
}
SysConfigVo sysConfigVo = sysConfigDao.getSysConfigByCode("sys_err_time");//锁定时间
String times = sysConfigVo.getSystemValue();
String looker = redisUtil.get("lock", user.getLoginName());
if (StringHelper.isEmpty(looker)) {//用户锁定
if ("1".equals(looker)) {
throw new LockedException("用户被锁定,请" + times + "分钟后重试");
}
}
if (user == null) {
saveLogs(user, "失败", "用户名或密码错误");
throw new AuthenticationCredentialsNotFoundException("用户名或密码错误");
} else {
if (StringHelper.isNotEmpty(user.getLoginType())) {
if (!user.getLoginType().contains("3")) {
saveLogs(user, "失败", "用户未授权请联系管理员授权");
throw new AuthenticationCredentialsNotFoundException("用户未授权请联系管理员授权");
}
int state = user.getState();
if (0 == state) {
saveLogs(user, "失败", "用户未激活");
throw new DisabledException("用户未激活,请联系管理员");
} else if (2 == state) {
saveLogs(user, "失败", "用户被锁定");
throw new LockedException("用户被锁定,请" + times + "分钟后重试");
}
} else {
saveLogs(user, "失败", "用户未授权请联系管理员授权");
throw new AuthenticationCredentialsNotFoundException("用户未授权请联系管理员授权");
}
}
}
public void saveLogs(SysUser user, String result, String msg) {
try {
SysLogs sysLogs = new SysLogs();
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
sysLogs.setUserId(user.getId() + "");//用户id
sysLogs.setOperatorUser(user.getLoginName());//用户名
sysLogs.setIp(WebUtils.getIpAddr(request));//ip
sysLogs.setId(UUID.randomUUID().toString().replace("-", "") + "");//主键
sysLogs.setUri("/login");//请求路径
sysLogs.setMethod("/login.login()");//方法名称
//获取参数
Map<String, Object> map = new HashMap<>();
sysLogs.setOperatorModel("系统登录");//操作模块
sysLogs.setOperatorType("登录");//操作类型 怎删改查
sysLogs.setLogsType("系统日志");//日志类型 业务日志/系统日志
sysLogs.setOperatorDetail("用户登录");//操作详情
sysLogs.setOperateTime(DateTimeHelper.getNowTime());
sysLogs.setResult(result);
sysLogs.setFailureReason(msg);
sysLogs.setTypes("0");
sysLogsDao.save(sysLogs);
} catch (Exception e) {
log.error(e.toString(), e);
}
}
}