package com.ots.framework.shiro.service;
|
import com.ots.common.constant.Constants;
|
import com.ots.common.constant.ShiroConstants;
|
import com.ots.common.constant.UserConstants;
|
import com.ots.common.exception.user.*;
|
import com.ots.common.utils.DateUtils;
|
import com.ots.common.utils.MessageUtils;
|
import com.ots.common.utils.ServletUtils;
|
import com.ots.common.utils.security.ShiroUtils;
|
import com.ots.framework.manager.AsyncManager;
|
import com.ots.framework.manager.factory.AsyncFactory;
|
import com.ots.project.system.user.domain.User;
|
import com.ots.project.system.user.domain.UserStatus;
|
import com.ots.project.system.user.service.IUserService;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.StringUtils;
|
|
@Component
|
public class LoginService {
|
@Autowired
|
private PasswordService passwordService;
|
@Autowired
|
private IUserService userService;
|
|
public User login(String username, String password) {
|
|
if (!StringUtils.isEmpty(ServletUtils.getRequest().getAttribute(ShiroConstants.CURRENT_CAPTCHA))) {
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
|
throw new CaptchaException();
|
}
|
|
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null")));
|
throw new UserNotExistsException();
|
}
|
|
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
throw new UserPasswordNotMatchException();
|
}
|
|
if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|
|| username.length() > UserConstants.USERNAME_MAX_LENGTH) {
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
|
throw new UserPasswordNotMatchException();
|
}
|
|
User user = userService.selectUserByLoginName(username);
|
if (user == null && maybeMobilePhoneNumber(username)) {
|
user = userService.selectUserByPhoneNumber(username);
|
}
|
if (user == null && maybeEmail(username)) {
|
user = userService.selectUserByEmail(username);
|
}
|
if (user == null) {
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.not.exists")));
|
throw new UserNotExistsException();
|
}
|
if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.delete")));
|
throw new UserDeleteException();
|
}
|
if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.blocked", user.getRemark())));
|
throw new UserBlockedException();
|
}
|
passwordService.validate(user, password);
|
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
|
recordLoginInfo(user);
|
return user;
|
}
|
private boolean maybeEmail(String username) {
|
if (!username.matches(UserConstants.EMAIL_PATTERN)) {
|
return false;
|
}
|
return true;
|
}
|
private boolean maybeMobilePhoneNumber(String username) {
|
if (!username.matches(UserConstants.MOBILE_PHONE_NUMBER_PATTERN)) {
|
return false;
|
}
|
return true;
|
}
|
|
public void recordLoginInfo(User user) {
|
user.setLoginIp(ShiroUtils.getIp());
|
user.setLoginDate(DateUtils.getNowDate());
|
userService.updateUserInfo(user);
|
}
|
}
|