SystemAction.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. package com.minpay.common.action;
  2. import java.net.InetAddress;
  3. import java.net.UnknownHostException;
  4. import java.util.Arrays;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10. import org.apache.commons.lang.StringUtils;
  11. import com.min.sha1.SHA1;
  12. import com.min.util.CommonUtil;
  13. import com.min.util.DateUtil;
  14. import com.minpay.common.bean.AuthRule;
  15. import com.minpay.common.bean.User;
  16. import com.minpay.common.constant.Constant;
  17. import com.minpay.common.exception.BusinessCodeException;
  18. import com.minpay.common.service.ICommonService;
  19. import com.minpay.common.service.IPublicService;
  20. import com.minpay.common.service.impl.PublicServiceImpl;
  21. import com.minpay.db.table.mapper.ImEntryCtrlMapper;
  22. import com.minpay.db.table.mapper.ImLogMapper;
  23. import com.minpay.db.table.mapper.ImRoleMapper;
  24. import com.minpay.db.table.mapper.ImUserMapper;
  25. import com.minpay.db.table.mapper.PubSendDetailMapper;
  26. import com.minpay.db.table.model.ImEntryCtrl;
  27. import com.minpay.db.table.model.ImEntryCtrlExample;
  28. import com.minpay.db.table.model.ImLog;
  29. import com.minpay.db.table.model.ImRole;
  30. import com.minpay.db.table.model.ImUser;
  31. import com.minpay.db.table.model.ImUserExample;
  32. import com.minpay.db.table.model.PubSendDetail;
  33. import com.minpay.db.table.model.PubSendDetailExample;
  34. import com.minpay.db.table.own.mapper.AuthMapper;
  35. import com.minpay.db.table.own.mapper.ImPckgLogonMapper.ImPckgLogonUserLogonOut;
  36. import com.minpay.db.table.own.mapper.SequenceMapper;
  37. import com.minpay.db.table.procedure.ImPackLogon;
  38. import com.rrtx.jedis.RedisUtil;
  39. import com.startup.minpay.frame.business.IMINAction;
  40. import com.startup.minpay.frame.business.MINHttpServletRequestContext;
  41. import com.startup.minpay.frame.business.res.MINActionResult;
  42. import com.startup.minpay.frame.constant.IMINBusinessConstant;
  43. import com.startup.minpay.frame.constant.IMINTransactionEnum;
  44. import com.startup.minpay.frame.exception.MINBusinessException;
  45. import com.startup.minpay.frame.service.MINServiceLocator;
  46. import com.startup.minpay.frame.service.base.IMINDataBaseService;
  47. import com.startup.minpay.frame.service.base.IMINSessionService;
  48. import com.startup.minpay.frame.service.base.Service;
  49. import com.startup.minpay.frame.session.MINSession;
  50. import com.startup.minpay.frame.target.MINAction;
  51. import com.startup.minpay.frame.target.MINComponent;
  52. import com.startup.minpay.frame.target.MINParam;
  53. import com.startup.minpay.util.DateTime;
  54. import com.startup.minpay.util.Env;
  55. import com.startup.minpay.util.Log;
  56. import com.startup.minpay.util.RandomUtil;
  57. /**
  58. * 登录处理类
  59. *
  60. * @author lixj
  61. */
  62. @MINComponent
  63. public class SystemAction implements IMINAction {
  64. private IMINDataBaseService db;
  65. private static String LAST_MOBILE_TIME = "LAST_MOBILE_TIME";
  66. private static String MOBILE_RANDOM = "MOBILE_RANDOM";
  67. private static String MOBILE_NO = "MOBILE_NO";
  68. @MINAction(value = "test", session = false)
  69. public MINActionResult login(
  70. HttpServletRequest request,
  71. HttpServletResponse response) {
  72. MINActionResult res = new MINActionResult();
  73. res.set("key", "vale11111");
  74. return res;
  75. }
  76. @MINAction(value = "isCheckSMS", session = false, transaction = IMINTransactionEnum.CMT)
  77. public MINActionResult isCheckSMS(
  78. MINHttpServletRequestContext request
  79. ) throws MINBusinessException {
  80. MINActionResult res = new MINActionResult();
  81. // 判断是否验证短信验证码
  82. String regVal = Service.lookup(IPublicService.class).getSysParValue("CHECK_LOGIN_MOBILE");
  83. res.set("isCheckSms", regVal);
  84. return res;
  85. }
  86. /**
  87. * 发送手机短信
  88. * @param userName
  89. * @return
  90. * @throws MINBusinessException
  91. */
  92. @MINAction(value = "sendSMSMessage", session = false, transaction = IMINTransactionEnum.CMT)
  93. public MINActionResult sendSMSMessage(
  94. @MINParam(key = "userName") String userName,
  95. MINHttpServletRequestContext request
  96. ) throws MINBusinessException {
  97. MINActionResult res = new MINActionResult();
  98. db = Service.lookup(IMINDataBaseService.class);
  99. // 判断是否验证短信验证码
  100. String regVal = Service.lookup(IPublicService.class).getSysParValue("CHECK_LOGIN_MOBILE");
  101. // 不检查短信验证码
  102. if("false".equals(regVal)) {
  103. return res;
  104. }
  105. // 验证是否已经发送验证码
  106. HttpSession httpSession = request.getSession();
  107. String lastMobileTime = (String)httpSession.getAttribute(LAST_MOBILE_TIME);
  108. // 如果已经发送过短信验证码,并且在60S以内,稍后再发送
  109. if(StringUtils.isNotBlank(lastMobileTime)
  110. && DateUtil.getDifferentTimeByMinute(-1).compareTo(lastMobileTime) < 0) {
  111. throw new MINBusinessException("JA000035", "请勿频繁发送验证码!");
  112. }
  113. // 查询用户
  114. ImUserExample userExample = new ImUserExample();
  115. userExample.createCriteria().andLogonnameEqualTo(userName).andSttNotEqualTo("5");
  116. userExample.or(userExample.createCriteria().andPhoneEqualTo(userName).andSttNotEqualTo("5"));
  117. List<ImUser> delList = db.selectByExample(ImUserMapper.class, userExample);
  118. if(delList.size() == 0) {
  119. throw new MINBusinessException("请检查用户名输入的是否正确!");//用户名不存在
  120. }
  121. // 获取手机号
  122. String mobileNo = delList.get(0).getPhone();
  123. // 是否一分钟内已经有短信验证码
  124. PubSendDetailExample deExp = new PubSendDetailExample();
  125. deExp.createCriteria().andUseridEqualTo(mobileNo).andLasttimeGreaterThan(DateUtil.getDifferentTimeByMinute(-1));
  126. List<PubSendDetail> deList = Service.lookup(IMINDataBaseService.class).getMybatisMapper(PubSendDetailMapper.class).selectByExample(deExp);
  127. if(deList.size() > 0) {
  128. throw new MINBusinessException("发送验证码过于频繁,请稍后重试!");
  129. }
  130. // 获取随机数
  131. String random = PublicServiceImpl.generateNumber(6);
  132. // 获取验证码时间
  133. httpSession.setAttribute(LAST_MOBILE_TIME, DateUtil.getCurrentDateTimeString());
  134. // 验证码
  135. httpSession.setAttribute(MOBILE_RANDOM, random);
  136. // 手机号
  137. httpSession.setAttribute(MOBILE_NO, mobileNo);
  138. // 验证码:@,如非本人操作,请忽略本短信【国贸铝业】
  139. String msgVal = Service.lookup(IPublicService.class).getSysParValue("COMM_MOBILE_MODE");
  140. res.set("mobileLastNum", mobileNo.substring(6));
  141. String msg = msgVal.replaceAll("@", random);
  142. // TODO
  143. // SmsSendUtil.sendSms(mobileNo, msg);
  144. PubSendDetail sendDetail = new PubSendDetail();
  145. sendDetail.setCode(random);
  146. sendDetail.setUserid(mobileNo);
  147. sendDetail.setLasttime(DateUtil.getCurrentDateTimeString());
  148. sendDetail.setStatus("0");
  149. Service.lookup(IMINDataBaseService.class).getMybatisMapper(PubSendDetailMapper.class).insertSelective(sendDetail);
  150. return res;
  151. }
  152. @MINAction(value = "login", session = false, transaction = IMINTransactionEnum.CMT)
  153. public MINActionResult login(
  154. HttpServletRequest request,
  155. HttpServletResponse response,
  156. MINSession session,
  157. @MINParam(key = "userName") String userName,
  158. @MINParam(key = "userPwd") String userPwd,
  159. @MINParam(key = "mbCode") String mbCode
  160. ) throws MINBusinessException {
  161. MINActionResult res = new MINActionResult();
  162. db = Service.lookup(IMINDataBaseService.class);
  163. // 判断是否验证短信验证码
  164. String regVal = Service.lookup(IPublicService.class).getSysParValue("CHECK_LOGIN_MOBILE");
  165. if("true".equals(regVal)) {
  166. // 验证是否已经发送验证码
  167. HttpSession httpSession = request.getSession();
  168. // 验证码
  169. String sessionCode = (String)httpSession.getAttribute(MOBILE_RANDOM);
  170. // 手机号
  171. String sessionMobileNo = (String)httpSession.getAttribute(MOBILE_NO);
  172. // 非法数据
  173. if(CommonUtil.isEmpty(sessionCode)
  174. || CommonUtil.isEmpty(sessionMobileNo)) {
  175. throw new MINBusinessException("JA000035", "验证码异常!");
  176. }
  177. // 查询用户
  178. ImUserExample userExample = new ImUserExample();
  179. userExample.createCriteria().andLogonnameEqualTo(userName).andSttNotEqualTo("5");
  180. userExample.or(userExample.createCriteria().andPhoneEqualTo(userName).andSttNotEqualTo("5"));
  181. List<ImUser> delList = db.selectByExample(ImUserMapper.class, userExample);
  182. if(delList.size() == 0) {
  183. throw new BusinessCodeException("请检查用户名输入的是否正确!");//用户名不存在
  184. }
  185. // 获取手机号
  186. String mobileNo = delList.get(0).getPhone();
  187. // 非法数据
  188. if(CommonUtil.isEmpty(sessionCode)
  189. || CommonUtil.isEmpty(sessionMobileNo)
  190. || !sessionMobileNo.equals(mobileNo)
  191. || !sessionCode.equals(mbCode)) {
  192. throw new MINBusinessException("JA000035", "验证码不正确!");
  193. }
  194. httpSession.setAttribute(MOBILE_RANDOM, "");
  195. }
  196. userName=userName.trim();
  197. //查看是否注销
  198. ImUserExample userExample = new ImUserExample();
  199. userExample.createCriteria().andLogonnameEqualTo(userName).andSttEqualTo("5");
  200. userExample.or(userExample.createCriteria().andPhoneEqualTo(userName).andSttEqualTo("5"));
  201. List delList = db.selectByExample(ImUserMapper.class, userExample);
  202. if (delList.size() ==1) {
  203. throw new BusinessCodeException("JINM0016");//用户已注销
  204. }
  205. // 查询操作员
  206. userExample = new ImUserExample();
  207. userExample.createCriteria().andLogonnameEqualTo(userName).andSttNotEqualTo("5").andProjectCodeEqualTo(Constant.PROJECT_CODE);
  208. userExample.or(userExample.createCriteria().andPhoneEqualTo(userName).andSttNotEqualTo("5").andProjectCodeEqualTo(Constant.PROJECT_CODE));
  209. List userList = db.selectByExample(ImUserMapper.class, userExample);
  210. if (userList.size() <= 0) {
  211. throw new BusinessCodeException("JINM0019");//用户名不存在
  212. }
  213. ImUser user = (ImUser) userList.get(0);
  214. String userId = user.getId();
  215. String companyId = user.getCompanyId();
  216. //add itemid
  217. // 柜员密码加密
  218. String encryedPwd = SHA1.enCoded(userId + userPwd);
  219. InetAddress inet = null;
  220. String serverIp = "";
  221. String serverPort = "";
  222. try {
  223. inet = InetAddress.getLocalHost();
  224. serverIp = inet.getHostAddress();
  225. } catch (UnknownHostException e) {
  226. serverIp = "127.0.0.1";
  227. }
  228. // 校验登录密码,获取用户信息
  229. ImPackLogon logon = new ImPackLogon();
  230. ImPckgLogonUserLogonOut logonOut = logon.userLogon(userId, encryedPwd);
  231. String retCode = logonOut.getOutRetcode();
  232. Log.info("checkLog retCode:"+retCode);
  233. if (!"0".equals(retCode)) {
  234. String dateTime = (new DateTime()).toDateTimeString();
  235. String errorCode = "11111111";//密码输错,登陆失败标志
  236. String logNo = db.getMybatisMapper(SequenceMapper.class).getSequence("IM_LOG_NO");
  237. ImLog imLog = new ImLog();
  238. imLog.setLogno(logNo);
  239. imLog.setUserid(userId);
  240. imLog.setBsncode("00000000");
  241. imLog.setDatetime(dateTime);
  242. imLog.setResult(errorCode);
  243. imLog.setInfo("操作员姓名:"+user.getName()+ " , 登录名:"+user.getLogonname());
  244. imLog.setIp(Service.lookup(ICommonService.class).getIPAddress(request));
  245. db.insert(ImLogMapper.class, imLog);
  246. throw new BusinessCodeException(retCode);
  247. }
  248. //判断此用户上次修改密码的时间是否为空,为空说明此用户第一次登录,否则不是
  249. if(user.getLastmodpwdcgdate()!=null&&!"".equals(user.getLastmodpwdcgdate())){
  250. //确认登录成功后查看此用户上次修改密码的时间是否大于一个月
  251. if(DateUtil.getCurrentDate().getTime()-DateUtil.parseDate(user.getLastmodpwdcgdate(), "yyyyMMddhhmmss").getTime()>((long)3*30*24*60*60*1000)){
  252. //大于一个月的情况下设置用户需要强行修改密码
  253. user.setInitpwd("0");
  254. db.updateByPrimaryKeySelective(ImUserMapper.class, user);
  255. }
  256. }else{
  257. //上次修改密码时间为空的情况下强求要求用户修改密码
  258. user.setInitpwd("0");
  259. db.updateByPrimaryKeySelective(ImUserMapper.class, user);
  260. }
  261. String isSingleSignOn = Env.get(IMINBusinessConstant.F_SINGLESIGNON);
  262. if( isSingleSignOn.equals("true") ) { //是否控制单点登录, 在config文件中配置
  263. //如果已经登录,则踢下线
  264. ImEntryCtrlExample example = new ImEntryCtrlExample();
  265. example.createCriteria().andUseridEqualTo(userId);
  266. List<ImEntryCtrl> records = Service.lookup(IMINDataBaseService.class).selectByExample(ImEntryCtrlMapper.class, example);
  267. if( records.size()>0 ) {
  268. Service.lookup(IMINDataBaseService.class).deleteByExample(ImEntryCtrlMapper.class,example );
  269. for(ImEntryCtrl record : records) {
  270. MINServiceLocator.getInstance().lookup(IMINSessionService.class).unRegisterSession(null, new MINSession(null, record.getSessionid()));
  271. }
  272. }
  273. }
  274. //session信息记录数据库
  275. String dateTime = new DateTime().toDateTimeString();
  276. String sessionId = request.getSession().getId();
  277. String serverAddress = serverIp+serverPort;
  278. //判断当前用户是否登录状态,登录则更新
  279. ImEntryCtrlExample example = new ImEntryCtrlExample();
  280. example.createCriteria().andUseridEqualTo(userId).andSessionidEqualTo(sessionId);
  281. List<ImEntryCtrl> records = Service.lookup(IMINDataBaseService.class).selectByExample(ImEntryCtrlMapper.class, example);
  282. if(records.size() == 0){//当前用户会话不存在,需要增加一条记录
  283. ImEntryCtrl imEntryCtrl = new ImEntryCtrl();
  284. imEntryCtrl.setUserid(userId);
  285. imEntryCtrl.setLogontime(dateTime);
  286. imEntryCtrl.setSessionid(sessionId);
  287. imEntryCtrl.setServer(serverAddress);
  288. Service.lookup(IMINDataBaseService.class).insert(ImEntryCtrlMapper.class, imEntryCtrl);
  289. }else{//更新当前数据
  290. ImEntryCtrl imEntryCtrl = records.get(0);
  291. imEntryCtrl.setSessionid(sessionId);
  292. imEntryCtrl.setUserid(userId);
  293. imEntryCtrl.setLogontime(dateTime);
  294. imEntryCtrl.setServer(serverAddress);
  295. Service.lookup(IMINDataBaseService.class).updateByPrimaryKeySelective(ImEntryCtrlMapper.class, imEntryCtrl);
  296. }
  297. String roleId = logonOut.getOutUserroleid();
  298. String name = logonOut.getOutName();
  299. String lastDate = logonOut.getOutLastlogon();
  300. String branchId = logonOut.getOutBranchid();
  301. String initPwd = logonOut.getOutInitpwd();
  302. String initAuthPwd = logonOut.getOutInitauthpwd();
  303. // 查询角色名称
  304. ImRole role = db.selectByPrimaryKey(ImRoleMapper.class, roleId);
  305. String roleName = role.getName();
  306. // 创建session
  307. String ip = Service.lookup(ICommonService.class).getIPAddress(request);
  308. User sessionUser = new User(db.selectByPrimaryKey(ImUserMapper.class, userId));
  309. sessionUser.setAuthpwd(userPwd);
  310. res.setSessionId(MINServiceLocator.getInstance().lookup(IMINSessionService.class).registerSession(request, sessionUser));
  311. sessionUser.setLastLoginTime(lastDate);
  312. sessionUser.setName(name);
  313. sessionUser.setRoleId(roleId);
  314. sessionUser.setRoleName(roleName);
  315. sessionUser.setBranchId(branchId);
  316. sessionUser.setBranchid(branchId);
  317. sessionUser.setIP(ip);
  318. sessionUser.setCompanyId(companyId);
  319. sessionUser.setInitPwd(initPwd);
  320. sessionUser.setInitAuthPwd(initAuthPwd);
  321. // 主页
  322. sessionUser.setIndexPage(logonOut.getIndexPage());
  323. sessionUser.getAuth().clear();
  324. List<Map<String, String>> ls = Service.lookup(IMINDataBaseService.class).getMybatisMapper(AuthMapper.class).roleAuth(roleId);
  325. for (Map<String, String> m : ls) {
  326. AuthRule rule = new AuthRule();
  327. rule.setUrl(m.get("url"));
  328. rule.setAuthType(m.get("authtype"));
  329. rule.setAuthShape(m.get("authshape"));
  330. rule.setItemId(m.get("itemid"));
  331. if (m.get("authrole") != null)
  332. rule.setAuthRole(Arrays.asList(m.get("authrole").split(",")));
  333. sessionUser.setAuth(m.get("url"), rule);
  334. }
  335. // // 如果是站长,需要获取站长的商户号
  336. // ZhMerchantExample mercherExp = new ZhMerchantExample();
  337. // mercherExp.createCriteria().andPhoneEqualTo(sessionUser.getMobile()).andStatusEqualTo("0");
  338. //
  339. // List<ZhMerchant> merList = Service.lookup(IMINDataBaseService.class)
  340. // .getMybatisMapper(ZhMerchantMapper.class).selectByExample(mercherExp);
  341. // // 如果存在站长
  342. // if(merList.size() > 0) {
  343. // sessionUser.setTuanzhangId(merList.get(0).getId());
  344. // }
  345. String logInfo = "登录系统:".concat(name);
  346. String logNo = db.getMybatisMapper(SequenceMapper.class).getSequence("IM_LOG_NO");
  347. ImLog imLog = new ImLog();
  348. imLog.setLogno(logNo);
  349. imLog.setUserid(userId);
  350. imLog.setBsncode("00000001");
  351. imLog.setDatetime(dateTime);
  352. imLog.setResult("00000000");
  353. imLog.setInfo(logInfo);
  354. imLog.setIp(ip);
  355. db.insert(ImLogMapper.class, imLog);
  356. //传递登录操作员IDs
  357. res.set("loginUserId", sessionUser.getId());
  358. res.set("logincompanyId", sessionUser.getCompanyId());
  359. res.set("branchId", sessionUser.getBranchId());
  360. res.set("roleId", sessionUser.getRoleId());
  361. // redis集成
  362. String token = RandomUtil.generateString(50);
  363. RedisUtil.setString(token, com.alibaba.fastjson.JSONArray.toJSON(sessionUser).toString(), 3600);
  364. sessionUser.setToken(token);
  365. res.set("token", sessionUser.getToken());
  366. return res;
  367. }
  368. /**
  369. * 退出登录
  370. * @param request
  371. * @param response
  372. * @param session
  373. * @return
  374. */
  375. @MINAction(value = "loginOut", session = false)
  376. public MINActionResult loginOut(HttpServletRequest request,
  377. HttpServletResponse response,
  378. MINSession session) {
  379. MINActionResult res = new MINActionResult();
  380. try {
  381. //处理正常状态
  382. if( session != null ){
  383. MINServiceLocator.getInstance()
  384. .lookup(IMINSessionService.class)
  385. .unRegisterSession(request, session);
  386. }
  387. } catch (Exception ex){
  388. }
  389. return res;
  390. }
  391. @MINAction(value = "checkPassword", session = false)
  392. public MINActionResult checkPassword(HttpServletRequest request,
  393. HttpServletResponse response,
  394. MINSession session) {
  395. MINActionResult res = new MINActionResult();
  396. res.set("MINStatus", 3);
  397. return res;
  398. }
  399. }