package com.uas.sso.service.impl; import com.uas.sso.common.encrypt.MD5; import com.uas.sso.core.Const; import com.uas.sso.core.Status; import com.uas.sso.core.Type; import com.uas.sso.dao.UserDao; import com.uas.sso.entity.User; import com.uas.sso.exception.VisibleError; import com.uas.sso.logging.UserBufferedLogger; import com.uas.sso.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import com.uas.sso.exception.AccountException; import java.sql.Timestamp; /** * 用户service实现类 * * @author wangmh * @date 2018/1/2 */ @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; private UserBufferedLogger userLog = new UserBufferedLogger(); @Override public User findByMobile(String mobile, String mobileArea) { return userDao.findByMobileAndMobileArea(mobile, mobileArea); } @Override public User findByMobile(String mobile) { return userDao.findByMobile(mobile); } @Override public boolean mobileHasRegistered(String mobile) { User user = userDao.findByMobile(mobile); if (user == null) { return false; } return true; } @Override public User register(User user) { // 校验手机号是否被注册 if (mobileHasRegistered(user.getMobile())) { throw new VisibleError("该手机号已被注册"); } // 由于现在不考虑手机号所属区域,默认为中国大陆 if (StringUtils.isEmpty(user.getMobileArea())) { user.setMobileArea(Const.CONTINENT); } // 设置基本属性,手机号默认已认证 user.setRegisterDate(new Timestamp(System.currentTimeMillis())); Long uu = userDao.findMaxUU(); user.setUserUU(uu == null ? 10000 : (uu + 1)); user.setSalt(String.valueOf(user.getUserUU())); user.setMobileIsValid((short) Status.AUTHENTICATED.getCode()); user.setEmailIsValid((short) Status.NOT_APPLYING.getCode()); user.setIdentityIsValid((short) Status.NOT_APPLYING.getCode()); user.setPassword(getEncryPassword(Const.ENCRY_FORMAT, user.getPassword(), user.getSalt())); userDao.save(user); userLog.info(user, Type.UPDATE_REGISTER.getValue()); return user; } @Override public String getEncryPassword(String format, String noEncryPwd, String salt) { if (StringUtils.isEmpty(format)) { return noEncryPwd; } // 超过32认为是已加密过的密文 if (noEncryPwd.length() >= 32) { /// 之后添加日志时恢复 //logger.error("用户密码加密", String.format("传递过来的密码(%s)必须是未加密的明文", noEncryPwd)); throw new AccountException("invalid password"); } // $password{$salt} String password = format.replace(Const.ENCRY_PARAM_PASSWORD, noEncryPwd); password = password.replace(Const.ENCRY_PARAM_SALT, salt == null ? "" : salt); return MD5.toMD5(password); } @Override public User save(User user) { return userDao.save(user); } @Override public void checkPassword(Long userUU, String password, boolean isEncry) { // 根据用户uu号找到旧数据 User oldUser = userDao.findByUserUU(userUU); if (oldUser == null) { throw new VisibleError("该用户不存在"); } // 密码未加密,转换成加密后的密码 String encryPassword = password; if (!isEncry) { encryPassword = getEncryPassword(Const.ENCRY_FORMAT, password, oldUser.getSalt()); } // 校验密码 if (!encryPassword.equals(password)) { throw new VisibleError("密码不一致"); } } }