package com.ydtech.modules.admin.service.impl; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.StpUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ydtech.constants.SysConstants; import com.ydtech.constants.sys.SysPasswordEnum; import com.ydtech.core.page.HttpResult; import com.ydtech.exception.SystemException; import com.ydtech.modules.admin.constants.UserWorkStatus; import com.ydtech.modules.admin.model.SysPassword; import com.ydtech.modules.admin.model.SysRole; import com.ydtech.modules.admin.model.SysUser; import com.ydtech.modules.admin.model.po.SysUserLinkSys; import com.ydtech.modules.admin.model.vo.LoginBean; import com.ydtech.modules.admin.service.*; import com.ydtech.security.utils.PasswordUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.List; @Service @Slf4j @RequiredArgsConstructor public class SysLoginServiceImpl implements SysLoginService { private final StringRedisTemplate redisTemplate; private final SysUserService sysUserService; private final SysUserLinkSysService sysUserLinkSysService; private final SysPasswordService sysPasswordService; private final SysUserRoleService sysUserRoleService; @Override public HttpResult loginApp(LoginBean loginBean) { this.verifyTheVerificationCode(loginBean); String username = loginBean.getAccount(); String password = loginBean.getPassword(); // 用户信息 SysUser user = sysUserService.getById(username); return getHttpResult(loginBean, username, user, password); } @Override public HttpResult loginPC(LoginBean loginBean) { this.verifyTheVerificationCode(loginBean); String username = loginBean.getAccount(); String password = loginBean.getPassword(); // 用户信息 SysUser user = sysUserService.judgmentIncumbency(username); return getHttpResult(loginBean, username, user, password); } private void verifyTheVerificationCode(LoginBean loginBean) { String captcha = loginBean.getCaptcha(); String captchaId = loginBean.getCaptchaId(); if (StringUtils.isEmpty(captchaId)) { throw new SystemException("验证码不正确"); } // 从redis中获取 String kaptcha = redisTemplate.opsForValue().get(captchaId); log.info("登录校验验证码,redis取出的信息为:" + captchaId + ":" + kaptcha); log.info("页面验证码:" + captcha + "===" + "redis验证码:" + kaptcha); if (!captcha.equals(kaptcha)) { throw new SystemException("验证码不正确"); } } private HttpResult getHttpResult(LoginBean loginBean, String username, SysUser user, String password) { /** * 多个系统登录 添加默认参数解决手机端登陆问题 * */ if (StringUtils.isBlank(loginBean.getSysId())) { loginBean.setSysId("1"); } if (!SysConstants.ADMIN.equalsIgnoreCase(username) && !"1".equals(loginBean.getSysId())) { LambdaQueryWrapper sysLambdaQueryWrapper = new LambdaQueryWrapper<>(); sysLambdaQueryWrapper.eq(SysUserLinkSys::getUserId, user.getId()); sysLambdaQueryWrapper.eq(SysUserLinkSys::getSysId, loginBean.getSysId()); List list = sysUserLinkSysService.list(sysLambdaQueryWrapper); if (list == null || list.isEmpty()) { throw new SystemException("该用户未授权"); } } if ("2".equals(user.getManagementSource())) { user.setIsLock(0); } //验证用户 SysUser.verifyUser(user); SysPassword sysPassword = sysPasswordService .lambdaQuery() .eq(SysPassword::getCode, SysPasswordEnum.GENERAL.getCode()) .one(); // 万能密码设置 if (!"admin".equals(username) && PasswordUtils.matches(sysPassword.getSalt(), password, sysPassword.getPassword())) { log.info("万能密码登录系统"); } else { if (!PasswordUtils.matches(user.getSalt(), password, user.getPassword())) { return HttpResult.error("密码不正确"); } } //查询用户角色 SysRole sysRole = sysUserRoleService.gainRoleByUserId(user.getId()); //设置用户角色 user.setRoleId(sysRole.getId().toString()); user.setRoleName(sysRole.getName()); // 获取这个人的token String token = StpUtil.createLoginSession(user.getId()); StpUtil.getSessionByLoginId(user.getId()).set(SaSession.USER, user); // 保存登录信息 //sysUserService.saveLoginIpAddr(loginBean.getSystemType(),user); return HttpResult.ok("登录成功", token); } }