package com.doumee.service.system.impl; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.system.dto.LoginDTO; import com.doumee.dao.system.dto.WebLoginDTO; import com.doumee.dao.system.model.SystemLoginLog; import com.doumee.dao.system.model.SystemUser; import com.doumee.service.common.CaptchaService; import com.doumee.service.system.SystemLoginLogService; import com.doumee.service.system.SystemLoginService; import com.doumee.service.system.SystemUserService; 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.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.Date; @Slf4j @Service public class SystemLoginServiceImpl implements SystemLoginService { @Value("${project.version}") private String systemVersion; @Autowired private CaptchaService captchaService; @Autowired private SystemUserService systemUserService; @Autowired private SystemLoginLogService systemLoginLogService; @Lazy @Autowired private SystemDictDataBiz systemDictDataBiz; @Value("${captcha_check}") private Boolean captchaCheck; @Override public String loginByPassword(LoginDTO dto, HttpServletRequest request) { return doLogin(dto,true,request); } @Override public String loginByPasswordWeb(WebLoginDTO dto, HttpServletRequest request) { LoginDTO d = new LoginDTO(); d.setPassword(dto.getPassword()); d.setUsername(dto.getUsername()); return doLogin(d,false,request); } public String doLogin(LoginDTO dto,boolean needCheckCode, HttpServletRequest request) { if(StringUtils.isBlank(dto.getUsername()) ||StringUtils.isBlank(dto.getPassword()) ||(needCheckCode &&StringUtils.isBlank(dto.getCode()))){ throw new BusinessException(ResponseStatus.BAD_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(needCheckCode){ // 校验验证码 if(captchaCheck) { 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(Constants.ZERO); systemLoginLogService.create(loginLog); throw e; } } } // 校验用户名和密码 Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(dto.getUsername(), dto.getPassword()); try { subject.login(token); SystemUser u = new SystemUser(); u.setLastLogin(DateUtil.getCurrentDate()); u.setId(loginLog.getUserId()); systemUserService.updateLoginDate(u); loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId()); loginLog.setSuccess(Constants.ZERO); 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(Constants.ONE); systemLoginLogService.create(loginLog); if (e.getCause() instanceof BusinessException) { throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), e.getCause().getMessage()); } throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), "对不起,账号或密码错误!"); } } }