NC6 用户账号密码加密工具类

RBAC用户密码工具类:

package nc.vo.uap.rbac.util;

import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;

import nc.bcmanage.superadm.bs.SuperADMCache;
import nc.bcmanage.vo.SuperAdminVO;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.logging.Logger;
import nc.bs.uif2.BusinessExceptionAdapter;
import nc.jdbc.framework.SQLParameter;
import nc.login.vo.INCUserTypeConstant;
import nc.vo.framework.rsa.Encode;
import nc.vo.pub.BusinessException;
import nc.vo.sm.UserVO;

/**
 * RBAC用户密码工具
 * @author hanyw1
 * @since uap6.1
 */
public class RbacUserPwdUtil {

	/**为了能区分用户密码是否被md5加密完,在被md5加密的串前面加前缀**/
	public final static String MD5PWD_PREFIX = "U_U++--V";
	
	//最初的密码前缀过于简单,但为了兼容先保持一段时间。 逐渐替换
	@Deprecated
	public final static String MD5PWD_PREFIX_Deprecated = "md5";
	
	/**
	 * 获取大小写字母和数字混搭的8位长度随机密码
	 * @return
	 */
	public static String getRandomSeq() {
		StringBuffer buff = new StringBuffer();
		int index = 0;
		for (int i = 0; i < 8; i++) {
			int random = (int) (Math.random() * 1000);
			if (i >= 3) {
				index = random % 3;
			} else {
				index = i;
			}
			switch (index) {
			case 0:
				buff.append((char) (97 + random % 26));
				break;
			case 1:
				buff.append((char) (65 + random % 26));
				break;				
			case 2:
				buff.append((char) (48 + random % 10));
				break;
			}
		}
		return buff.toString();
	}
	
    // 校验密码中必须包含一个字母和数字
	public boolean checkPwdType(String pwd) {
		String regExABC = "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|" +
		                  "A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z";
		Pattern patABC = Pattern.compile(regExABC);
		Matcher matABC = patABC.matcher(pwd); 
		String regEx123 = "0|1|2|3|4|5|6|7|8|9";
		Pattern pat123 = Pattern.compile(regEx123);
		Matcher mat123 = pat123.matcher(pwd);
		return matABC.find() && mat123.find();
	}
	
	/**
	 * 校验用户密码(仅是静态密码加密后的简单比对)
	 * @param user 用户VO
	 * @param expresslyPWD 待校验明文密码
	 * @return 校验通过返回 true,  校验不通过返回 false
	 */
	public static boolean checkUserPassword(UserVO user,String expresslyPWD) {
		if(user == null)
			return false;
		
		String userActualCodecPwd = getUserActualCodecPwd(user);
		
		Integer user_type = user.getUser_type();
		
		//非超级管理员密码不能为空,超级管理员密码可能为空
		if(user_type != null && user_type != INCUserTypeConstant.USER_TYPE_SUPER_ADM 
				&& (StringUtils.isBlank(userActualCodecPwd) || StringUtils.isBlank(expresslyPWD)) )
			return false;
		
		
		try{
			String toCheckCodecPwd = getEncodedPassword(user, expresslyPWD);
			
			boolean isValidByMD5 = userActualCodecPwd.equals(toCheckCodecPwd);
			
			if(!isValidByMD5){
				
				//兼容旧前缀
				boolean checkByOldPrefix = checkByMD5WithOldPrefix(user, expresslyPWD,userActualCodecPwd);
				if(checkByOldPrefix)
					return checkByOldPrefix;
				
				if(user_type == INCUserTypeConstant.USER_TYPE_SUPER_ADM){
					Encode encoder = new Encode();
					String codecPwdByEncoder = encoder.encode(expresslyPWD);
					
					return userActualCodecPwd.equals(codecPwdByEncoder);
				}else
					return isValidByMD5;
			}
			
			return isValidByMD5;
			
		}catch(Exception ex){
			Logger.debug(ex.getMessage());
			return false;
		}
	}

	private static String getUserActualCodecPwd(UserVO user) {
		try {
			if(user.getUser_type() == INCUserTypeConstant.USER_TYPE_SUPER_ADM){
				SuperAdminVO savo = SuperADMCache.getInstance().getSuperADMByCode(user.getUser_code());
				return savo.getPassword();
			}
			

			String dsName = InvocationInfoProxy.getInstance().getUserDataSource();
			//2021-08-21
			String userActualCodecPwd = null;
			BaseDAO dao = new BaseDAO(dsName);
			SQLParameter param = new SQLParameter();
			param.addParam(user.getUser_code_q());
			Collection<UserVO> list = dao.retrieveByClause(UserVO.class, " user_code_q=? ",param);
	        if(list != null && list.size()>0) {
				for(UserVO vo :list) {
					userActualCodecPwd = vo.getUser_password();
				}
			}
				
			
			return userActualCodecPwd;
		} catch (BusinessException e) {
			throw new BusinessExceptionAdapter(e);
		}
	}

	private static boolean checkByMD5WithOldPrefix(UserVO user,	String expresslyPWD, String userActualCodecPwd)
			throws BusinessException {
		
		String toCheckCodecPwdWithOldPrefix = getEncodedPassword_Deprecated(user, expresslyPWD);
		return userActualCodecPwd.equals(toCheckCodecPwdWithOldPrefix);
	}
	
	/**
	 * 由UserVO 和 明文密码获得 加密后的用户密码
	 * @param user
	 * @param expresslyPWD 明文密码
	 * @return  加密后的密码串
	 * @throws BusinessException
	 */
	public static String getEncodedPassword(UserVO user , String expresslyPWD) throws BusinessException{
		if(user == null || StringUtils.isBlank(user.getPrimaryKey()))
			throw new BusinessException("illegal arguments");
//		if(StringUtils.isNotBlank(expresslyPWD) && expresslyPWD.startsWith(MD5PWD_PREFIX))
//			return expresslyPWD;
		
		String codecPWD = DigestUtils.md5Hex(user.getPrimaryKey() + StringUtils.stripToEmpty(expresslyPWD));
		
		return MD5PWD_PREFIX+codecPWD;
	}
	
	//最初的密码前缀过于简单,但为了兼容先保持一段时间。 逐渐替换
	@Deprecated
	private static String getEncodedPassword_Deprecated(UserVO user , String expresslyPWD) throws BusinessException{
		if(user == null || StringUtils.isBlank(user.getPrimaryKey()))
			throw new BusinessException("illegal arguments");
		
		String codecPWD = DigestUtils.md5Hex(user.getPrimaryKey() + StringUtils.stripToEmpty(expresslyPWD));
		
		return MD5PWD_PREFIX_Deprecated+codecPWD;
	}
	
	
	public static void main(String[] args){
		UserVO user = new UserVO();
		
		user.setPrimaryKey("0001AA1000000000015I");
		
		try{
			System.out.println(getEncodedPassword(user, "ufida_ufida"));
			
		}catch(BusinessException ex){
			ex.printStackTrace();
		}
		
	}
}

package nc.itf.uap.rbac.userpassword;

import nc.vo.pub.BusinessException;
import nc.vo.sm.UserVO;
import nc.vo.uap.rbac.userpassword.UserPasswordVO;

public interface IUserPasswordManage {
	/**
	 * 密码有效
	 */
	int LOGIN_VALIDPWD = 0;
	/**
	 * 必须修改密码才能登录
	 */
	int LOGIN_UPDATEPWD = 1;
	/**
	 * 密码失效时锁定用户
	 */
	int LOGIN_LOCKUSER = 2;

	/**
	 */
	public void addUserPassword(UserPasswordVO voPassword)
			throws BusinessException;

	/**
	 */
	public void updateUserPassword(UserPasswordVO voPassword)
			throws BusinessException;

	public void handleErrorPassord(String userid, int errorTimes)
			throws BusinessException;

//	public int handleCorrectPasswordOnLogin(String userid, String password)
//			throws BusinessException;

	public String getValidateTipAfterLogin(String userid)
			throws BusinessException;

	
	/**
	 * 重置用户密码
	 * @param cuserid
	 * @throws BusinessException
	 */
	public String resetUserPassWord(String cuserid) throws BusinessException;
	
	
	/**
	 * 更改用户密码
	 * 不涉及数据权限校验,唯一性校验等
	 * @param userVO 更改前UserVO
	 * @param expresslyPwd 要修改的明文密码
	 * @throws BusinessException
	 */
	void changeUserPassWord(UserVO userVO, String expresslyPwd) throws BusinessException;
	
	
	/**
	 * 校验用户密码
	 * @param cuserid 被校验用户ID
	 * @param expresslyPWD 输入的明文密码
	 * @return
	 * @throws BusinessException
	 */
	boolean checkUserPassWord(String cuserid,String expresslyPWD) throws BusinessException;
	
}

package nc.impl.uap.rbac.userpassword;


import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

import nc.bs.businessevent.EventDispatcher;
import nc.bs.businessevent.IEventType;
import nc.bs.businessevent.bd.BDCommonEvent;
import nc.bs.dao.BaseDAO;
import nc.bs.dao.DAOException;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.framework.common.NCLocator;
import nc.bs.framework.core.service.TimeService;
import nc.bs.logging.Logger;
import nc.bs.rbac.utils.WriteSecurityUtil;
import nc.itf.bd.pub.IBDMetaDataIDConstBasic;
import nc.itf.uap.rbac.IUserManage;
import nc.itf.uap.rbac.IUserManageQuery;
import nc.itf.uap.rbac.userpassword.IUserPasswordChecker;
import nc.itf.uap.rbac.userpassword.IUserPasswordLevel;
import nc.itf.uap.rbac.userpassword.IUserPasswordManage;
import nc.jdbc.framework.SQLParameter;
import nc.message.pub.mobile.SMSAndMailUtil;
import nc.message.util.QuickMessageTool;
import nc.message.vo.MessageVO;
import nc.message.vo.NCMessage;
import nc.message.vo.SmartMsgVO;
import nc.vo.ml.LanguageVO;
import nc.vo.ml.MultiLangContext;
import nc.vo.ml.UserLangCodeFindHelper;
import nc.vo.pub.BusinessException;
import nc.vo.pub.lang.UFDate;
import nc.vo.pub.lang.UFDateTime;
import nc.vo.sm.UserVO;
import nc.vo.sm.enumfactory.UserIdentityTypeEnumFactory;
import nc.vo.uap.rbac.UserPasswordLogVO;
import nc.vo.uap.rbac.excp.RbacException;
import nc.vo.uap.rbac.userpassword.PasswordSecurityLevelFinder;
import nc.vo.uap.rbac.userpassword.PasswordSecurityLevelVO;
import nc.vo.uap.rbac.userpassword.UserPasswordVO;
import nc.vo.uap.rbac.util.IRbacConst;
import nc.vo.uap.rbac.util.RbacPubUtil;
import nc.vo.uap.rbac.util.RbacUserPwdUtil;
import nc.vo.uap.rbac.util.UserExManageUtil;
import nc.vo.util.BDPKLockUtil;
import nc.vo.util.CloneUtil;

import org.apache.commons.lang.StringUtils;

public class UserPasswordManage implements IUserPasswordManage {
	IUserManageQuery userManageQueryService = NCLocator.getInstance().lookup(IUserManageQuery.class);
//	IPsndocPubService psndocPubService = NCLocator.getInstance().lookup(IPsndocPubService.class);
	
	
	public void addUserPassword(UserPasswordVO voPassword) throws BusinessException {
		new BaseDAO().insertVO(voPassword);
	}

	public void updateUserPassword(UserPasswordVO voPassword) throws BusinessException {
		String userid = voPassword.getCuserid();
		PasswordSecurityLevelVO voPwdLevel = getPasswordLevelByUser(userid);
		if (voPwdLevel == null)
			return;
		Integer rememberCount = voPwdLevel.getRememberCount();
		if (rememberCount == null || rememberCount.intValue() == 0)
			return;// 表示密码记忆数没有设置,不进行记忆
		BaseDAO daoBase = new BaseDAO();
		String sCondition = "cuserid=?";
		SQLParameter param = new SQLParameter();
		param.addParam(userid);
		Collection collection = daoBase.retrieveByClause(UserPasswordVO.class, sCondition, param);
		int iLen = collection == null ? 0 : collection.size();
		if (iLen == 0) {
			daoBase.insertVO(voPassword);
		} else {
			// 遍历看看新密码有没有和历史密码重复,如果存在,则抛出异常不能使用此密码
			for (Iterator iter = collection.iterator(); iter.hasNext();) {
				UserPasswordVO element = (UserPasswordVO) iter.next();
				if (element.getUser_password().equals(voPassword.getUser_password()))
					throw new RbacException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("rbac","0RBAC0126")/*@res "和历史密码重复,不能使用此密码"*/);
			}

			// 没有找到密码重复,则插入新密码
			if (iLen >= rememberCount.intValue()) {// 达到了密码记忆数,则采用先进先出原则:先挤出最老密码
				Iterator iter = collection.iterator();
				UserPasswordVO element = (UserPasswordVO) iter.next();
				UFDateTime dateFirst = element.getTs();
				String pkFirst = element.getPrimaryKey();
				for (; iter.hasNext();) {
					element = (UserPasswordVO) iter.next();
					if (element.getTs().before(dateFirst))
						pkFirst = element.getPrimaryKey();
				}
				daoBase.deleteByPK(UserPasswordVO.class, pkFirst);
			}
			// 插入此新密码
			daoBase.insertVO(voPassword);
		}
	}

	public PasswordSecurityLevelVO getPasswordLevelByUser(String userid) throws BusinessException {
		IUserManageQuery userQuery = (IUserManageQuery) NCLocator.getInstance().lookup(IUserManageQuery.class.getName());
		UserVO voUser = userQuery.getUser(userid);
		if (voUser == null)
			return null;
		String sPasswordLevel = voUser.getPwdlevelcode();
		if (sPasswordLevel == null)
			return null;
		IUserPasswordLevel level = (IUserPasswordLevel) NCLocator.getInstance().lookup(IUserPasswordLevel.class.getName());
		PasswordSecurityLevelVO voPwdLevel = level.getLevelByCode(sPasswordLevel);
		return voPwdLevel;
	}

	public void handleErrorPassord(String userid, int errorTimes) throws BusinessException {
		PasswordSecurityLevelVO voPwdLevel = getPasswordLevelByUser(userid);
		if (voPwdLevel == null)
			return;
		Integer errorloginThreshold = voPwdLevel.getErrorloginThreshold();
		if (errorloginThreshold == null || errorTimes < errorloginThreshold.intValue())
			return;// 没有定义密码错误限制或者没有达到密码错误限制,则不处理
		IUserManage userManage = (IUserManage) NCLocator.getInstance().lookup(IUserManage.class.getName());
		userManage.updateLockedTag(userid,true);// 锁定用户
	}

//	public int handleCorrectPasswordOnLogin(String userid, String password) throws BusinessException {
//		PasswordSecurityLevelVO voPwdLevel = getPasswordLevelByUser(userid);
//		if (voPwdLevel == null)
//			return LOGIN_VALIDPWD;
///*		String defaultPassword = voPwdLevel.getDefaultPassword();
//		if (defaultPassword != null) {// 如果用户密码为初始密码,则要求必须修改密码才能登录
//			if (!new Encode().encode(defaultPassword).equals(password))
//				return LOGIN_UPDATEPWD;
//		}*/
//
//		// 超过密码有效天数,则必须修改密码才能登录
//		Integer validateDays = voPwdLevel.getValidateDays();
//		if (validateDays != null && validateDays.intValue() > 0) {
//			BaseDAO daoBase = new BaseDAO();
//			String condition = "cuserid=? and user_password=?";
//			SQLParameter param = new SQLParameter();
//			param.addParam(userid);
//			param.addParam(password);
//			Collection collection = daoBase.retrieveByClause(UserPasswordVO.class, condition, new String[] { "ts" }, param);
//			if (collection != null && collection.size() > 0) {
//				UFDateTime ts = ((UserPasswordVO) collection.iterator().next()).getTs();
//				UFDate currDate = new UFDate(new Date());
//				if (currDate.compareTo(ts.getDate()) >= validateDays.intValue()) {
//					if (voPwdLevel.getInvalidateLock() != null && voPwdLevel.getInvalidateLock().booleanValue())
//						// 密码失效时锁定用户
//						return LOGIN_LOCKUSER;
//					else
//						// 否则必须修改密码才能登录
//						return LOGIN_UPDATEPWD;
//				}
//			}
//		}
//
//		String complexity = voPwdLevel.getComplexity();
//		if (complexity != null) {
//			IUserManageQuery userQuery = (IUserManageQuery) NCLocator.getInstance().lookup(IUserManageQuery.class.getName());
//			UserVO user = userQuery.getUser(userid);
//			if (user == null)
//				return LOGIN_VALIDPWD;
//			try {
//				IUserPassordVerifier verifier = (IUserPassordVerifier) Class.forName(complexity).newInstance();
//				password = new Encode().decode(password);// 密码解密
//				if (!verifier.verify(password))// 不符合密码复杂性要求,则看是否要求必须修改密码才能登录
//					if (verifier.isLoginModify())
//						return LOGIN_UPDATEPWD;
//			} catch (Exception e) {
//			}
//		}
//
//		return LOGIN_VALIDPWD;
//	}

	public String getValidateTipAfterLogin(String userid) throws BusinessException {
		PasswordSecurityLevelVO voPwdLevel = getPasswordLevelByUser(userid);
		if (voPwdLevel == null)
			return null;
		Integer alertDays = voPwdLevel.getAlertDays();
		if (alertDays == null || alertDays.intValue() == 0)
			return null;
		Integer validateDays = voPwdLevel.getValidateDays();
		if (validateDays == null || validateDays.intValue() == 0)
			return null;
		
		UserVO user = null;
		BaseDAO daoBase = new BaseDAO();
		SQLParameter param1 = new SQLParameter();
		param1.addParam(userid);
		Collection<UserVO> list = daoBase.retrieveByClause(UserVO.class, " cuserid=?",param1);
		if(list != null && list.size()>0) {
			for(UserVO vo :list) {
				user = vo;
			}
		}
		
		if (user == null)
			return null;
		String sTip = null;
		

		String condition = "cuserid=?  and user_password=?";
		SQLParameter param = new SQLParameter();
		param.addParam(userid);
		param.addParam(user.getUser_password());
		Collection collection = daoBase.retrieveByClause(UserPasswordVO.class, condition, new String[] { "ts" },param);
		if (collection != null && collection.size() > 0) {
			UFDateTime ts = ((UserPasswordVO) collection.iterator().next()).getTs();
			// 计算得出要提示的日期:
			UFDate tipDate = ts.getDate().getDateAfter(validateDays.intValue() - alertDays.intValue());
			UFDate currDate = new UFDate(new Date());
			if (!currDate.before(tipDate)) {
				int passdays = currDate.compareTo(tipDate);
				sTip = nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("rbac","0RBAC0127")/*@res "密码还有"*/ + (alertDays - passdays) + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("rbac","0RBAC0128")/*@res "天失效"*/;
			}
		}
		return sTip;
	}

	@Override
	public void changeUserPassWord(UserVO userVO,String expresslyPwd) throws BusinessException {

		//因为前台去掉了用户密码,所以重新从数据库中查出
		revokeUserPassWord(userVO);
		
		String oldPwd = userVO.getUser_password();
		String newPwd = RbacUserPwdUtil.getEncodedPassword(userVO, expresslyPwd);		

		if (StringUtils.isNotBlank(userVO.getPwdlevelcode())
				&& !StringUtils.equals(oldPwd, newPwd)) {// 2007-07-18:插入用户密码记忆数

			//发个用户更新前事件,有相关业务关心密码修改前事件
			String sourceid = IBDMetaDataIDConstBasic.USER;
			UserVO newVO = (UserVO) CloneUtil.deepClone(userVO);
			newVO.setUser_password(newPwd);			
			EventDispatcher.fireEvent(new BDCommonEvent(sourceid,IEventType.TYPE_UPDATE_BEFORE, newVO));
			
			userVO = doUpdateUserPwd(userVO, newPwd);
			
			IUserPasswordChecker updateChecker = (IUserPasswordChecker) NCLocator.getInstance().lookup(
					IUserPasswordChecker.class.getName());
			updateChecker.updateUPVO(userVO.getPrimaryKey(), oldPwd, PasswordSecurityLevelFinder.getPWDLV(userVO));
			// 插入密码更改记录
			insertPasswordLog(userVO.getPrimaryKey());
			
			//发个用户更新后事件,有相关业务关心用户更新后事件
			EventDispatcher.fireEvent(new BDCommonEvent(sourceid,IEventType.TYPE_UPDATE_AFTER, userVO));
		}
	}

	private void revokeUserPassWord(UserVO userVO) throws BusinessException {
		
		BaseDAO dao = new BaseDAO();
		SQLParameter param = new SQLParameter();
		param.addParam(userVO.getCuserid());
		Collection<UserVO> list = dao.retrieveByClause(UserVO.class," cuserid=?",param);
		if(list != null && list.size()>0) {
			for(UserVO vo :list) {
				userVO.setUser_password(vo.getUser_password());
			}
		}
			
	}

	private UserVO doUpdateUserPwd(UserVO userVO, String newPwd) throws BusinessException, DAOException {
		BaseDAO baseDAO = new BaseDAO();
		userVO.setUser_password(newPwd);
		// 加锁
		BDPKLockUtil.lockSuperVO(userVO);
		// 数据库更新
		baseDAO.updateVO(userVO);
		// 这次是新的
		userVO = (UserVO) baseDAO.retrieveByPK(userVO.getClass(), userVO.getPrimaryKey());
		
		return userVO;
	}


	// 插入用户密码重置记录
	private void insertPasswordLog(String cuserid) throws BusinessException {
		UserPasswordLogVO logVO = new UserPasswordLogVO();
		logVO.setCuserid(cuserid);
		String modifier = InvocationInfoProxy.getInstance().getUserId();
		logVO.setModifier(modifier);
		logVO.setModifiedtime(new UFDateTime(TimeService.getInstance().getTime()));
		new BaseDAO().insertVO(logVO);
	}

	@Override
	public String resetUserPassWord(String cuserid) throws BusinessException {

		UserVO user = userManageQueryService.getUser(cuserid);
//		PasswordSecurityLevelVO pslVO = PasswordSecurityLevelFinder.getPWDLV(user);
//		int len = pslVO.getMinimumLength() == null ? 0 : pslVO.getMinimumLength().intValue();
		// TODO 这里生成一个随机串 以后可能根据密码配置来进行
//		String randomSeq = len > 0 ? RandomSeqUtil.getRandomSeq(len) : RandomSeqUtil.getRandomSeq();
		
		// 获取大小写字母和数字混搭的8位长度随机密码
		String randomSeq = RbacUserPwdUtil.getRandomSeq();
		
		// 已经插入密码记忆数了
		changeUserPassWord(user,randomSeq);

		String msg = notifyPasswordChanged(randomSeq, user);
		
		//重置完密码后在用户状态异常表中加入异常信息,以能标识密码是否是被重置的
		UserExManageUtil.getInstance().addPwdResetUser(cuserid);		
		
		//记录安全日志
		WriteSecurityUtil.writeSecurityLog("UAP", "User Management", 50,
				"User Management : reset Password", user, "success", null, new String[]{"user_code"});
		return msg;
	}


	private String notifyPasswordChanged(String randomSeq, UserVO user) throws BusinessException {

//		String psnDocId = userManageQueryService.queryPsndocByUserid(cuserid);

		//发送消息给密码被修改人:NC消息,邮件、短信。
		sendNCMessage(randomSeq, user);
		return RbacPubUtil.getNameByMultiLang(user, UserVO.USER_NAME) + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("rbac","0RBAC0129")/*@res "该用户密码已经被重置为:"*/ + randomSeq;

//		if (StringUtil.isEmptyWithTrim(psnDocId)) {
//			Logger.debug("");
//		} else {
//
//			String msg = null;
//			PsndocVO[] psnDocVOs = psndocPubService.queryPsndocByPks(new String[] { psnDocId },new String[] { PsndocVO.EMAIL });
//			if (psnDocVOs != null && psnDocVOs.length > 0) {
//
//				String emailAddress = psnDocVOs[0].getEmail();
//				if (StringUtil.isEmptyWithTrim(emailAddress)) {
//					// 找不到邮件地址
//					msg = "你的密码已经被重置为" + randomSeq;
//				} else {
//					sendNCMessage(randomSeq, cuserid);
//					msg = "您的密码已经被重置,查收您的邮箱";
//				}
//
//			}
//		}
	}

	private void sendNCMessage(String randomSeq, UserVO user) throws BusinessException {

		try {
			int base_doc_type = user.getBase_doc_type();
			String pk_base_doc = user.getPk_base_doc();
			
//			if(StringUtils.isBlank(pk_base_doc)) return;
			
			if(base_doc_type == UserIdentityTypeEnumFactory.TYPE_PERSON){
				String receiver = StringUtils.isNotEmpty(user.getEmail()) ? user.getEmail() : "";
				SmartMsgVO msgVO = createSmartMsgVO(user.getPrimaryKey(), randomSeq,receiver);
				QuickMessageTool.sendMessage(msgVO);
				return;
			}
			
			BaseDAO dao = new BaseDAO();
			String phoneNum = null;
			String email = null;
//			if(base_doc_type == UserIdentityTypeEnumFactory.TYPE_CUSTOMER){
//				ICustomerPubService  custPubService = NCLocator.getInstance().lookup(ICustomerPubService.class);
//				//-----如下这段逻辑,客户与供应商可能不相同,不要合并
//				String pk_linkman = custPubService.getDefaultLinkman(pk_base_doc);
//				if(StringUtils.isBlank(pk_linkman)) return;
//				LinkmanVO linkman = (LinkmanVO) dao.retrieveByPK(LinkmanVO.class, pk_linkman);
//				if(linkman == null) return;
//				
//				phoneNum = linkman.getCell();
//				email = linkman.getEmail();	
//			}
//			
//			if(base_doc_type == UserIdentityTypeEnumFactory.TYPE_PROVIDER){
//				ISupplierPubService supplierPubService = NCLocator.getInstance().lookup(ISupplierPubService.class);
//				//-----如下这段逻辑,客户与供应商可能不相同,不要合并
//				String pk_linkman = supplierPubService.getDefaultLinkman(pk_base_doc);
//				if(StringUtils.isBlank(pk_linkman)) return;
//				
//				LinkmanVO linkman = (LinkmanVO) dao.retrieveByPK(LinkmanVO.class, pk_linkman);
//				if(linkman == null) return;
//
//				phoneNum = linkman.getCell();
//				email = linkman.getEmail();	
//			}
			
			MessageVO message = createEmailMessage(user.getPrimaryKey(), email, randomSeq);
			NCMessage ncMessage = new NCMessage();
			ncMessage.setMessage(message);
			
			/********************以下是发邮件和发短信,如果发生异常则吃掉记日志,不影响流程*************/
			try{
				SMSAndMailUtil.sendMailSMS(new NCMessage[]{ncMessage});
			}catch(Exception ex1){
				Logger.error(ex1.getMessage());
			}
			
			try{
				SMSAndMailUtil.sendSMS(new String[]{phoneNum}, message.getContent());	
			}catch(Exception ex2){
				Logger.error(ex2.getMessage());
			}		
			
		} catch (Exception e) {
			Logger.error(e.getMessage());
			throw new BusinessException(e.getMessage());
		}
	}
	
	private MessageVO createEmailMessage(String cuserid,String email, String randomSeq){
		//按照接收者默认语种设置主题---hanyw1  2012-3-6
		String currentLangCode = InvocationInfoProxy.getInstance().getLangCode();
		String receiverDefaultLangCode = UserLangCodeFindHelper.getUserLangDefCode(cuserid);
		//设置接收者默认的语种
		InvocationInfoProxy.getInstance().setLangCode(receiverDefaultLangCode);
		
		MessageVO message = new MessageVO();
		// 发NC消息
		String content = nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("rbac","0RBAC0130")/*@res "您的密码被重置为:"*/ + randomSeq;
		message.setContent(content);
		message.setSubject(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("rbac","0RBAC0131")/*@res "密码重置通知"*/);
		
		//再还原语种
		InvocationInfoProxy.getInstance().setLangCode(currentLangCode);
		
		message.setSender(IRbacConst.NCUSERPK);
		message.setMsgtype("email");
		message.setReceiver(email);
		
		return message;
	}

	private SmartMsgVO createSmartMsgVO(String cuserid,String randomSeq,String receiver) {
		//按照接收者默认语种设置主题---hanyw1  2012-3-6
		String currentLangCode = InvocationInfoProxy.getInstance().getLangCode();
		String receiverDefaultLangCode = UserLangCodeFindHelper.getUserLangDefCode(cuserid);
		String receiverLangCode = "simpchn";
		LanguageVO [] enableLangVOs = MultiLangContext.getInstance().getEnableLangVOs();
		if(null != enableLangVOs && enableLangVOs.length>0){
			for(int i=0;i<enableLangVOs.length;i++){
				String pk_lang = enableLangVOs[i].getPk_multilang();
				if(pk_lang.equals(receiverDefaultLangCode)){
					receiverLangCode = enableLangVOs[i].getLangcode();
					break;
				}
			}
		}
		//设置接收者默认的语种
		InvocationInfoProxy.getInstance().setLangCode(receiverLangCode);
		
		SmartMsgVO msgVO = new SmartMsgVO();
		// 发NC消息
		String content = nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("rbac","0RBAC0130")/*@res "您的密码被重置为:"*/ + randomSeq;
		msgVO.setContent(content);
		
		msgVO.setSubject(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("rbac","0RBAC0131")/*@res "密码重置通知"*/);
		//再还原语种
		InvocationInfoProxy.getInstance().setLangCode(currentLangCode);
		
		msgVO.setSender(IRbacConst.NCUSERPK);
		msgVO.setMsgtype("email");
		msgVO.setReceiver(receiver);
		return msgVO;
	}

	@Override
	public boolean checkUserPassWord(String cuserid, String expresslyPWD) throws BusinessException {
		if(StringUtils.isBlank(cuserid) || StringUtils.isBlank(expresslyPWD))
			throw new BusinessException("illegal arguments, cuserid and expresslyPWD can't be null");
		
		IUserManageQuery userQry = NCLocator.getInstance().lookup(IUserManageQuery.class);
		UserVO user = userQry.getUser(cuserid);
		
		if(user == null) throw new BusinessException("can't find user by cuserid ");
		
		return RbacUserPwdUtil.checkUserPassword(user, expresslyPWD);		
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值