package com.doumee.service.system.impl; import com.doumee.config.jwt.JwtTokenUtil; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.utils.Constants; import com.doumee.core.utils.Utils; import com.doumee.dao.business.dao.CompanyMapper; import com.doumee.dao.business.model.Company; import com.doumee.dao.system.dto.LoginByOpenidDTO; import com.doumee.dao.system.dto.LoginDTO; import com.doumee.dao.system.model.*; import com.doumee.service.common.CaptchaService; import com.doumee.service.system.*; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.List; import java.util.Objects; @Slf4j @Service public class SystemLoginServiceImpl implements SystemLoginService { @Value("${project.version}") private String systemVersion; @Value("${debug_model}") private Boolean isDebug; @Lazy @Autowired private SystemUserService systemUserService; @Lazy @Autowired private SystemDataPermissionService systemDataPermissionService; @Lazy @Autowired private SystemRoleService systemRoleService; @Lazy @Autowired private SystemPermissionService systemPermissionService; @Autowired private CaptchaService captchaService; @Autowired private SystemLoginLogService systemLoginLogService; @Autowired private CompanyMapper companyMapper; @Resource private JwtTokenUtil jwtTokenUtil; @Override public String loginByPassword(LoginDTO dto, HttpServletRequest request) { SystemLoginLog loginLog = new SystemLoginLog(); loginLog.setLoginUsername(dto.getUsername()); loginLog.setLoginTime(new Date()); loginLog.setSystemVersion(systemVersion); loginLog.setIp(Utils.User_Client.getIP(request)); loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp())); loginLog.setPlatform(Utils.User_Client.getPlatform(request)); loginLog.setClientInfo(Utils.User_Client.getBrowser(request)); loginLog.setOsInfo(Utils.User_Client.getOS(request)); loginLog.setServerIp(Utils.Server.getIP()); if((isDebug == null || !isDebug) && (Objects.isNull(dto.getCheckCode()) || dto.getCheckCode()) ){ // 校验验证码 try { captchaService.check(dto.getUuid(), dto.getCode()); } catch (Exception e) { log.error(e.getMessage(), e); loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage()); loginLog.setSuccess(Boolean.FALSE); systemLoginLogService.create(loginLog); throw e; } } // 校验用户名和密码 Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(dto.getUsername(), dto.getPassword()); try { subject.login(token); loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId()); loginLog.setSuccess(Boolean.TRUE); systemLoginLogService.create(loginLog); return (String)subject.getSession().getId(); } catch (AuthenticationException e) { log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e); loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage()); loginLog.setSuccess(Boolean.FALSE); systemLoginLogService.create(loginLog); throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT); } } @Override public LoginUserInfo loginByPasswordNew(LoginDTO dto, ServerHttpRequest request) { SystemLoginLog loginLog = new SystemLoginLog(); loginLog.setLoginUsername(dto.getUsername()); loginLog.setLoginTime(new Date()); loginLog.setSystemVersion(systemVersion); loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp())); if(request!=null&&request.getHeaders()!=null && request.getHeaders().size()>0){ loginLog.setIp(Utils.User_Client.getIP(request)); loginLog.setPlatform(Utils.User_Client.getPlatform(request)); loginLog.setClientInfo(Utils.User_Client.getBrowser(request)); loginLog.setOsInfo(Utils.User_Client.getOS(request)); } loginLog.setServerIp(Utils.Server.getIP()); if(isDebug == null || !isDebug){ // 校验验证码 try { captchaService.check(dto.getUuid(), dto.getCode()); } catch (Exception e) { log.error(e.getMessage(), e); loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage()); loginLog.setSuccess(Boolean.FALSE); systemLoginLogService.create(loginLog); throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(),"对不起,验证码不正确!"); } } // 根据用户名查询用户对象 SystemUser queryDto = new SystemUser(); queryDto.setUsername(dto.getUsername()); queryDto.setDeleted(Boolean.FALSE); SystemUser user = systemUserService.findOne(queryDto); if (user == null) { throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT); } if(!Constants.equalsInteger(user.getSource(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.NO_ALLOW_LOGIN); } String pwd = Utils.Secure.encryptPassword(new String(dto.getPassword()), user.getSalt()); // 比较密码 if( !StringUtils.equals(pwd, user.getPassword())){ throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT); } Company company = new Company(); if(Objects.nonNull(user.getCompanyId())){ company = companyMapper.selectById(user.getCompanyId()); } // 获取登录用户信息 List roles = systemRoleService.findByUserId(user.getId()); List permissions = systemPermissionService.findByUserId(user.getId()); SystemRole rt = new SystemRole(); rt.setDeleted(Boolean.FALSE); //数据部门权限集合 user.setCompanyIdList(systemDataPermissionService.selectHighRole(new SystemDataPermission(),rt,user)); LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions,company,null); return userInfo; } /** * 内部人员 与 司机 根据code查询openId后进行登录接口 * @return */ @Override public String loginByUserId(Integer userId) { SystemLoginLog loginLog = new SystemLoginLog(); loginLog.setLoginTime(new Date()); loginLog.setSystemVersion(systemVersion); loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp())); loginLog.setServerIp(Utils.Server.getIP()); // 根据用户名查询用户对象 SystemUser user = systemUserService.findById(userId); if (user == null) { throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT); } Company company = new Company(); if(Objects.nonNull(user.getCompanyId())){ company = companyMapper.selectById(user.getCompanyId()); } // 获取登录用户信息 List roles = systemRoleService.findByUserId(user.getId()); List permissions = systemPermissionService.findByUserId(user.getId()); SystemRole rt = new SystemRole(); rt.setDeleted(Boolean.FALSE); //数据部门权限集合 user.setCompanyIdList(systemDataPermissionService.selectHighRole(new SystemDataPermission(),rt,user)); LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions,company,null); String token = jwtTokenUtil.generateToken(userInfo); return token; } }