From c2fccb01b972176dc3da5a497b5e904025e9e98d Mon Sep 17 00:00:00 2001 From: bsw215583320 <baoshiwei121@163.com> Date: 星期二, 16 四月 2024 15:06:51 +0800 Subject: [PATCH] Merge branch 'master' of http://210.22.126.130:1111/r/dry/herb --- jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java | 734 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 734 insertions(+), 0 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java new file mode 100644 index 0000000..80fbe0e --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -0,0 +1,734 @@ +package org.jeecg.modules.system.controller; + +import cn.hutool.core.util.RandomUtil; +import com.alibaba.fastjson.JSONObject; +import com.aliyuncs.exceptions.ClientException; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.constant.CacheConstant; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.constant.SymbolConstant; +import org.jeecg.common.system.util.JwtUtil; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.common.util.*; +import org.jeecg.common.util.encryption.EncryptedString; +import org.jeecg.config.JeecgBaseConfig; +import org.jeecg.modules.base.service.BaseCommonService; +import org.jeecg.modules.system.entity.SysDepart; +import org.jeecg.modules.system.entity.SysRoleIndex; +import org.jeecg.modules.system.entity.SysTenant; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.model.SysLoginModel; +import org.jeecg.modules.system.service.*; +import org.jeecg.modules.system.service.impl.SysBaseApiImpl; +import org.jeecg.modules.system.util.RandImageUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + * @Author scott + * @since 2018-12-17 + */ +@RestController +@RequestMapping("/sys") +@Api(tags="鐢ㄦ埛鐧诲綍") +@Slf4j +public class LoginController { + @Autowired + private ISysUserService sysUserService; + @Autowired + private ISysPermissionService sysPermissionService; + @Autowired + private SysBaseApiImpl sysBaseApi; + @Autowired + private ISysLogService logService; + @Autowired + private RedisUtil redisUtil; + @Autowired + private ISysDepartService sysDepartService; + @Autowired + private ISysTenantService sysTenantService; + @Autowired + private ISysDictService sysDictService; + @Resource + private BaseCommonService baseCommonService; + + @Autowired + private JeecgBaseConfig jeecgBaseConfig; + + private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890"; + + @ApiOperation("鐧诲綍鎺ュ彛") + @RequestMapping(value = "/login", method = RequestMethod.POST) + public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel){ + Result<JSONObject> result = new Result<JSONObject>(); + String username = sysLoginModel.getUsername(); + String password = sysLoginModel.getPassword(); + //update-begin-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + if(isLoginFailOvertimes(username)){ + return result.error500("璇ョ敤鎴风櫥褰曞け璐ユ鏁拌繃澶氾紝璇蜂簬10鍒嗛挓鍚庡啀娆$櫥褰曪紒"); + } + //update-end-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + //update-begin--Author:scott Date:20190805 for锛氭殏鏃舵敞閲婃帀瀵嗙爜鍔犲瘑閫昏緫锛屾湁鐐归棶棰� + //鍓嶇瀵嗙爜鍔犲瘑锛屽悗绔繘琛屽瘑鐮佽В瀵� + //password = AesEncryptUtil.desEncrypt(sysLoginModel.getPassword().replaceAll("%2B", "\\+")).trim();//瀵嗙爜瑙e瘑 + //update-begin--Author:scott Date:20190805 for锛氭殏鏃舵敞閲婃帀瀵嗙爜鍔犲瘑閫昏緫锛屾湁鐐归棶棰� + + //update-begin-author:taoyan date:20190828 for:鏍¢獙楠岃瘉鐮� +// String captcha = sysLoginModel.getCaptcha(); +// if(captcha==null){ +// result.error500("楠岃瘉鐮佹棤鏁�"); +// return result; +// } +// String lowerCaseCaptcha = captcha.toLowerCase(); + //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + // 鍔犲叆瀵嗛挜浣滀负娣锋穯锛岄伩鍏嶇畝鍗曠殑鎷兼帴锛岃澶栭儴鍒╃敤锛岀敤鎴疯嚜瀹氫箟璇ュ瘑閽ュ嵆鍙� + String origin = sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret(); + String realKey = Md5Util.md5Encode(origin, "utf-8"); + //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + Object checkCode = redisUtil.get(realKey); + //褰撹繘鍏ョ櫥褰曢〉鏃讹紝鏈変竴瀹氬嚑鐜囧嚭鐜伴獙璇佺爜閿欒 #1714 +// if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { +// log.warn("楠岃瘉鐮侀敊璇紝key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode); +// result.error500("楠岃瘉鐮侀敊璇�"); +// // 鏀规垚鐗规畩鐨刢ode 渚夸簬鍓嶇鍒ゆ柇 +// result.setCode(HttpStatus.PRECONDITION_FAILED.value()); +// return result; +// } + //update-end-author:taoyan date:20190828 for:鏍¢獙楠岃瘉鐮� + + //1. 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥 + //update-begin-author:wangshuai date:20200601 for: 鐧诲綍浠g爜楠岃瘉鐢ㄦ埛鏄惁娉ㄩ攢bug锛宨f鏉′欢姘歌繙涓篺alse + LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysUser::getUsername,username); + SysUser sysUser = sysUserService.getOne(queryWrapper); + //update-end-author:wangshuai date:20200601 for: 鐧诲綍浠g爜楠岃瘉鐢ㄦ埛鏄惁娉ㄩ攢bug锛宨f鏉′欢姘歌繙涓篺alse + result = sysUserService.checkUserIsEffective(sysUser); + if(!result.isSuccess()) { + return result; + } + + //2. 鏍¢獙鐢ㄦ埛鍚嶆垨瀵嗙爜鏄惁姝g‘ + String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt()); + String syspassword = sysUser.getPassword(); + if (!syspassword.equals(userpassword)) { + //update-begin-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + addLoginFailOvertimes(username); + //update-end-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒"); + return result; + } + + //鐢ㄦ埛鐧诲綍淇℃伅 + userInfo(sysUser, result); + //update-begin--Author:liusq Date:20210126 for锛氱櫥褰曟垚鍔燂紝鍒犻櫎redis涓殑楠岃瘉鐮� + redisUtil.del(realKey); + //update-begin--Author:liusq Date:20210126 for锛氱櫥褰曟垚鍔燂紝鍒犻櫎redis涓殑楠岃瘉鐮� + redisUtil.del(CommonConstant.LOGIN_FAIL + username); + LoginUser loginUser = new LoginUser(); + BeanUtils.copyProperties(sysUser, loginUser); + baseCommonService.addLog("鐢ㄦ埛鍚�: " + username + ",鐧诲綍鎴愬姛锛�", CommonConstant.LOG_TYPE_1, null,loginUser); + //update-end--Author:wangshuai Date:20200714 for锛氱櫥褰曟棩蹇楁病鏈夎褰曚汉鍛� + return result; + } + + + /** + * 銆恦ue3涓撶敤銆戣幏鍙栫敤鎴蜂俊鎭� + */ + @GetMapping("/user/getUserInfo") + public Result<JSONObject> getUserInfo(HttpServletRequest request){ + Result<JSONObject> result = new Result<JSONObject>(); + String username = JwtUtil.getUserNameByToken(request); + if(oConvertUtils.isNotEmpty(username)) { + // 鏍规嵁鐢ㄦ埛鍚嶆煡璇㈢敤鎴蜂俊鎭� + SysUser sysUser = sysUserService.getUserByName(username); + JSONObject obj=new JSONObject(); + + //update-begin---author:scott ---date:2022-06-20 for锛歷ue3鍓嶇锛屾敮鎸佽嚜瀹氫箟棣栭〉----------- + String version = request.getHeader(CommonConstant.VERSION); + //update-begin---author:liusq ---date:2022-06-29 for锛氭帴鍙h繑鍥炲�间慨鏀癸紝鍚屾淇敼杩欓噷鐨勫垽鏂�昏緫----------- + SysRoleIndex roleIndex = sysUserService.getDynamicIndexByUserRole(username, version); + if (oConvertUtils.isNotEmpty(version) && roleIndex != null && oConvertUtils.isNotEmpty(roleIndex.getUrl())) { + String homePath = roleIndex.getUrl(); + if (!homePath.startsWith(SymbolConstant.SINGLE_SLASH)) { + homePath = SymbolConstant.SINGLE_SLASH + homePath; + } + sysUser.setHomePath(homePath); + } + //update-begin---author:liusq ---date:2022-06-29 for锛氭帴鍙h繑鍥炲�间慨鏀癸紝鍚屾淇敼杩欓噷鐨勫垽鏂�昏緫----------- + //update-end---author:scott ---date::2022-06-20 for锛歷ue3鍓嶇锛屾敮鎸佽嚜瀹氫箟棣栭〉-------------- + + obj.put("userInfo",sysUser); + obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); + result.setResult(obj); + result.success(""); + } + return result; + + } + + /** + * 閫�鍑虹櫥褰� + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/logout") + public Result<Object> logout(HttpServletRequest request,HttpServletResponse response) { + //鐢ㄦ埛閫�鍑洪�昏緫 + String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN); + if(oConvertUtils.isEmpty(token)) { + return Result.error("閫�鍑虹櫥褰曞け璐ワ紒"); + } + String username = JwtUtil.getUsername(token); + LoginUser sysUser = sysBaseApi.getUserByName(username); + if(sysUser!=null) { + //update-begin--Author:wangshuai Date:20200714 for锛氱櫥鍑烘棩蹇楁病鏈夎褰曚汉鍛� + baseCommonService.addLog("鐢ㄦ埛鍚�: "+sysUser.getRealname()+",閫�鍑烘垚鍔燂紒", CommonConstant.LOG_TYPE_1, null,sysUser); + //update-end--Author:wangshuai Date:20200714 for锛氱櫥鍑烘棩蹇楁病鏈夎褰曚汉鍛� + log.info(" 鐢ㄦ埛鍚�: "+sysUser.getRealname()+",閫�鍑烘垚鍔燂紒 "); + //娓呯┖鐢ㄦ埛鐧诲綍Token缂撳瓨 + redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token); + //娓呯┖鐢ㄦ埛鐧诲綍Shiro鏉冮檺缂撳瓨 + redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId()); + //娓呯┖鐢ㄦ埛鐨勭紦瀛樹俊鎭紙鍖呮嫭閮ㄩ棬淇℃伅锛夛紝渚嬪sys:cache:user::<username> + redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername())); + //璋冪敤shiro鐨刲ogout + SecurityUtils.getSubject().logout(); + return Result.ok("閫�鍑虹櫥褰曟垚鍔燂紒"); + }else { + return Result.error("Token鏃犳晥!"); + } + } + + /** + * 鑾峰彇璁块棶閲� + * @return + */ + @GetMapping("loginfo") + public Result<JSONObject> loginfo() { + Result<JSONObject> result = new Result<JSONObject>(); + JSONObject obj = new JSONObject(); + //update-begin--Author:zhangweijian Date:20190428 for锛氫紶鍏ュ紑濮嬫椂闂达紝缁撴潫鏃堕棿鍙傛暟 + // 鑾峰彇涓�澶╃殑寮�濮嬪拰缁撴潫鏃堕棿 + Calendar calendar = new GregorianCalendar(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date dayStart = calendar.getTime(); + calendar.add(Calendar.DATE, 1); + Date dayEnd = calendar.getTime(); + // 鑾峰彇绯荤粺璁块棶璁板綍 + Long totalVisitCount = logService.findTotalVisitCount(); + obj.put("totalVisitCount", totalVisitCount); + Long todayVisitCount = logService.findTodayVisitCount(dayStart,dayEnd); + obj.put("todayVisitCount", todayVisitCount); + Long todayIp = logService.findTodayIp(dayStart,dayEnd); + //update-end--Author:zhangweijian Date:20190428 for锛氫紶鍏ュ紑濮嬫椂闂达紝缁撴潫鏃堕棿鍙傛暟 + obj.put("todayIp", todayIp); + result.setResult(obj); + result.success("鐧诲綍鎴愬姛"); + return result; + } + + /** + * 鑾峰彇璁块棶閲� + * @return + */ + @GetMapping("visitInfo") + public Result<List<Map<String,Object>>> visitInfo() { + Result<List<Map<String,Object>>> result = new Result<List<Map<String,Object>>>(); + Calendar calendar = new GregorianCalendar(); + calendar.set(Calendar.HOUR_OF_DAY,0); + calendar.set(Calendar.MINUTE,0); + calendar.set(Calendar.SECOND,0); + calendar.set(Calendar.MILLISECOND,0); + calendar.add(Calendar.DAY_OF_MONTH, 1); + Date dayEnd = calendar.getTime(); + calendar.add(Calendar.DAY_OF_MONTH, -7); + Date dayStart = calendar.getTime(); + List<Map<String,Object>> list = logService.findVisitCount(dayStart, dayEnd); + result.setResult(oConvertUtils.toLowerCasePageList(list)); + return result; + } + + + /** + * 鐧婚檰鎴愬姛閫夋嫨鐢ㄦ埛褰撳墠閮ㄩ棬 + * @param user + * @return + */ + @RequestMapping(value = "/selectDepart", method = RequestMethod.PUT) + public Result<JSONObject> selectDepart(@RequestBody SysUser user) { + Result<JSONObject> result = new Result<JSONObject>(); + String username = user.getUsername(); + if(oConvertUtils.isEmpty(username)) { + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); + username = sysUser.getUsername(); + } + + //鑾峰彇鐧诲綍閮ㄩ棬 + String orgCode= user.getOrgCode(); + //鑾峰彇鐧诲綍绉熸埛 + Integer tenantId = user.getLoginTenantId(); + this.sysUserService.updateUserDepart(username, orgCode,tenantId); + SysUser sysUser = sysUserService.getUserByName(username); + JSONObject obj = new JSONObject(); + obj.put("userInfo", sysUser); + result.setResult(obj); + return result; + } + + /** + * 鐭俊鐧诲綍鎺ュ彛 + * + * @param jsonObject + * @return + */ + @PostMapping(value = "/sms") + public Result<String> sms(@RequestBody JSONObject jsonObject) { + Result<String> result = new Result<String>(); + String mobile = jsonObject.get("mobile").toString(); + //鎵嬫満鍙锋ā寮� 鐧诲綍妯″紡: "2" 娉ㄥ唽妯″紡: "1" + String smsmode=jsonObject.get("smsmode").toString(); + log.info(mobile); + if(oConvertUtils.isEmpty(mobile)){ + result.setMessage("鎵嬫満鍙蜂笉鍏佽涓虹┖锛�"); + result.setSuccess(false); + return result; + } + + //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+mobile; + Object object = redisUtil.get(redisKey); + //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + + if (object != null) { + result.setMessage("楠岃瘉鐮�10鍒嗛挓鍐咃紝浠嶇劧鏈夋晥锛�"); + result.setSuccess(false); + return result; + } + + //闅忔満鏁� + String captcha = RandomUtil.randomNumbers(6); + JSONObject obj = new JSONObject(); + obj.put("code", captcha); + try { + boolean b = false; + //娉ㄥ唽妯℃澘 + if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) { + SysUser sysUser = sysUserService.getUserByPhone(mobile); + if(sysUser!=null) { + result.error500(" 鎵嬫満鍙峰凡缁忔敞鍐岋紝璇风洿鎺ョ櫥褰曪紒"); + baseCommonService.addLog("鎵嬫満鍙峰凡缁忔敞鍐岋紝璇风洿鎺ョ櫥褰曪紒", CommonConstant.LOG_TYPE_1, null); + return result; + } + b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.REGISTER_TEMPLATE_CODE); + }else { + //鐧诲綍妯″紡锛屾牎楠岀敤鎴锋湁鏁堟�� + SysUser sysUser = sysUserService.getUserByPhone(mobile); + result = sysUserService.checkUserIsEffective(sysUser); + if(!result.isSuccess()) { + String message = result.getMessage(); + String userNotExist="璇ョ敤鎴蜂笉瀛樺湪锛岃娉ㄥ唽"; + if(userNotExist.equals(message)){ + result.error500("璇ョ敤鎴蜂笉瀛樺湪鎴栨湭缁戝畾鎵嬫満鍙�"); + } + return result; + } + + /** + * smsmode 鐭俊妯℃澘鏂瑰紡 0 .鐧诲綍妯℃澘銆�1.娉ㄥ唽妯℃澘銆�2.蹇樿瀵嗙爜妯℃澘 + */ + if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) { + //鐧诲綍妯℃澘 + b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.LOGIN_TEMPLATE_CODE); + } else if(CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) { + //蹇樿瀵嗙爜妯℃澘 + b = DySmsHelper.sendSms(mobile, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE); + } + } + + if (b == false) { + result.setMessage("鐭俊楠岃瘉鐮佸彂閫佸け璐�,璇风◢鍚庨噸璇�"); + result.setSuccess(false); + return result; + } + + //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + //楠岃瘉鐮�10鍒嗛挓鍐呮湁鏁� + redisUtil.set(redisKey, captcha, 600); + //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + + //update-begin--Author:scott Date:20190812 for锛歩ssues#391 + //result.setResult(captcha); + //update-end--Author:scott Date:20190812 for锛歩ssues#391 + result.setSuccess(true); + + } catch (ClientException e) { + e.printStackTrace(); + result.error500(" 鐭俊鎺ュ彛鏈厤缃紝璇疯仈绯荤鐞嗗憳锛�"); + return result; + } + return result; + } + + + /** + * 鎵嬫満鍙风櫥褰曟帴鍙� + * + * @param jsonObject + * @return + */ + @ApiOperation("鎵嬫満鍙风櫥褰曟帴鍙�") + @PostMapping("/phoneLogin") + public Result<JSONObject> phoneLogin(@RequestBody JSONObject jsonObject) { + Result<JSONObject> result = new Result<JSONObject>(); + String phone = jsonObject.getString("mobile"); + //update-begin-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + if(isLoginFailOvertimes(phone)){ + return result.error500("璇ョ敤鎴风櫥褰曞け璐ユ鏁拌繃澶氾紝璇蜂簬10鍒嗛挓鍚庡啀娆$櫥褰曪紒"); + } + //update-end-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + //鏍¢獙鐢ㄦ埛鏈夋晥鎬� + SysUser sysUser = sysUserService.getUserByPhone(phone); + result = sysUserService.checkUserIsEffective(sysUser); + if(!result.isSuccess()) { + return result; + } + + String smscode = jsonObject.getString("captcha"); + + //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+phone; + Object code = redisUtil.get(redisKey); + //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + + if (!smscode.equals(code)) { + //update-begin-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + addLoginFailOvertimes(phone); + //update-end-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + result.setMessage("鎵嬫満楠岃瘉鐮侀敊璇�"); + return result; + } + //鐢ㄦ埛淇℃伅 + userInfo(sysUser, result); + //娣诲姞鏃ュ織 + baseCommonService.addLog("鐢ㄦ埛鍚�: " + sysUser.getUsername() + ",鐧诲綍鎴愬姛锛�", CommonConstant.LOG_TYPE_1, null); + + return result; + } + + + /** + * 鐢ㄦ埛淇℃伅 + * + * @param sysUser + * @param result + * @return + */ + private Result<JSONObject> userInfo(SysUser sysUser, Result<JSONObject> result) { + String username = sysUser.getUsername(); + String syspassword = sysUser.getPassword(); + // 鑾峰彇鐢ㄦ埛閮ㄩ棬淇℃伅 + JSONObject obj = new JSONObject(new LinkedHashMap<>()); + + //1.鐢熸垚token + String token = JwtUtil.sign(username, syspassword); + // 璁剧疆token缂撳瓨鏈夋晥鏃堕棿 + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000); + obj.put("token", token); + + //2.璁剧疆鐧诲綍绉熸埛 + Result<JSONObject> loginTenantError = sysUserService.setLoginTenant(sysUser, obj, username,result); + if (loginTenantError != null) { + return loginTenantError; + } + + //3.璁剧疆鐧诲綍鐢ㄦ埛淇℃伅 + obj.put("userInfo", sysUser); + + //4.璁剧疆鐧诲綍閮ㄩ棬 + List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId()); + obj.put("departs", departs); + if (departs == null || departs.size() == 0) { + obj.put("multi_depart", 0); + } else if (departs.size() == 1) { + sysUserService.updateUserDepart(username, departs.get(0).getOrgCode(),null); + obj.put("multi_depart", 1); + } else { + //鏌ヨ褰撳墠鏄惁鏈夌櫥褰曢儴闂� + // update-begin--Author:wangshuai Date:20200805 for锛氬鏋滅敤鎴朵负閫夋嫨閮ㄩ棬锛屾暟鎹簱涓哄瓨鍦ㄤ笂涓�娆$櫥褰曢儴闂紝鍒欏彇涓�鏉″瓨杩涘幓 + SysUser sysUserById = sysUserService.getById(sysUser.getId()); + if(oConvertUtils.isEmpty(sysUserById.getOrgCode())){ + sysUserService.updateUserDepart(username, departs.get(0).getOrgCode(),null); + } + // update-end--Author:wangshuai Date:20200805 for锛氬鏋滅敤鎴朵负閫夋嫨閮ㄩ棬锛屾暟鎹簱涓哄瓨鍦ㄤ笂涓�娆$櫥褰曢儴闂紝鍒欏彇涓�鏉″瓨杩涘幓 + obj.put("multi_depart", 2); + } + obj.put("sysAllDictItems", sysDictService.queryAllDictItems()); + result.setResult(obj); + result.success("鐧诲綍鎴愬姛"); + return result; + } + + /** + * 鑾峰彇鍔犲瘑瀛楃涓� + * @return + */ + @GetMapping(value = "/getEncryptedString") + public Result<Map<String,String>> getEncryptedString(){ + Result<Map<String,String>> result = new Result<Map<String,String>>(); + Map<String,String> map = new HashMap(5); + map.put("key", EncryptedString.key); + map.put("iv",EncryptedString.iv); + result.setResult(map); + return result; + } + + /** + * 鍚庡彴鐢熸垚鍥惧舰楠岃瘉鐮� 锛氭湁鏁� + * @param response + * @param key + */ + @ApiOperation("鑾峰彇楠岃瘉鐮�") + @GetMapping(value = "/randomImage/{key}") + public Result<String> randomImage(HttpServletResponse response,@PathVariable("key") String key){ + Result<String> res = new Result<String>(); + try { + //鐢熸垚楠岃瘉鐮� + String code = RandomUtil.randomString(BASE_CHECK_CODES,4); + //瀛樺埌redis涓� + String lowerCaseCode = code.toLowerCase(); + + //update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + // 鍔犲叆瀵嗛挜浣滀负娣锋穯锛岄伩鍏嶇畝鍗曠殑鎷兼帴锛岃澶栭儴鍒╃敤锛岀敤鎴疯嚜瀹氫箟璇ュ瘑閽ュ嵆鍙� + String origin = lowerCaseCode+key+jeecgBaseConfig.getSignatureSecret(); + String realKey = Md5Util.md5Encode(origin, "utf-8"); + //update-end-author:taoyan date:2022-9-13 for: VUEN-2245 銆愭紡娲炪�戝彂鐜版柊婕忔礊寰呭鐞�20220906 + + redisUtil.set(realKey, lowerCaseCode, 60); + log.info("鑾峰彇楠岃瘉鐮侊紝Redis key = {}锛宑heckCode = {}", realKey, code); + //杩斿洖鍓嶇 + String base64 = RandImageUtil.generate(code); + res.setSuccess(true); + res.setResult(base64); + } catch (Exception e) { + log.error(e.getMessage(), e); + res.error500("鑾峰彇楠岃瘉鐮佸け璐�,璇锋鏌edis閰嶇疆!"); + return res; + } + return res; + } + + /** + * 鍒囨崲鑿滃崟琛ㄤ负vue3鐨勮〃 + */ + @RequiresRoles({"admin"}) + @GetMapping(value = "/switchVue3Menu") + public Result<String> switchVue3Menu(HttpServletResponse response) { + Result<String> res = new Result<String>(); + sysPermissionService.switchVue3Menu(); + return res; + } + + /** + * app鐧诲綍 + * @param sysLoginModel + * @return + * @throws Exception + */ + @RequestMapping(value = "/mLogin", method = RequestMethod.POST) + public Result<JSONObject> mLogin(@RequestBody SysLoginModel sysLoginModel) throws Exception { + Result<JSONObject> result = new Result<JSONObject>(); + String username = sysLoginModel.getUsername(); + String password = sysLoginModel.getPassword(); + JSONObject obj = new JSONObject(); + + //update-begin-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + if(isLoginFailOvertimes(username)){ + return result.error500("璇ョ敤鎴风櫥褰曞け璐ユ鏁拌繃澶氾紝璇蜂簬10鍒嗛挓鍚庡啀娆$櫥褰曪紒"); + } + //update-end-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + //1. 鏍¢獙鐢ㄦ埛鏄惁鏈夋晥 + SysUser sysUser = sysUserService.getUserByName(username); + result = sysUserService.checkUserIsEffective(sysUser); + if(!result.isSuccess()) { + return result; + } + + //2. 鏍¢獙鐢ㄦ埛鍚嶆垨瀵嗙爜鏄惁姝g‘ + String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt()); + String syspassword = sysUser.getPassword(); + if (!syspassword.equals(userpassword)) { + //update-begin-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + addLoginFailOvertimes(username); + //update-end-author:taoyan date:2022-11-7 for: issues/4109 骞冲彴鐢ㄦ埛鐧诲綍澶辫触閿佸畾鐢ㄦ埛 + result.error500("鐢ㄦ埛鍚嶆垨瀵嗙爜閿欒"); + return result; + } + + //3.璁剧疆鐧诲綍閮ㄩ棬 + String orgCode = sysUser.getOrgCode(); + if(oConvertUtils.isEmpty(orgCode)) { + //濡傛灉褰撳墠鐢ㄦ埛鏃犻�夋嫨閮ㄩ棬 鏌ョ湅閮ㄩ棬鍏宠仈淇℃伅 + List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId()); + //update-begin-author:taoyan date:20220117 for: JTC-1068銆恆pp銆戞柊寤虹敤鎴凤紝娌℃湁璁剧疆閮ㄩ棬鍙婅鑹诧紝鐐瑰嚮鐧诲綍鎻愮ず鏆傛湭褰掑睘閮紝涓�鐩村湪鐧诲綍椤甸潰 浣跨敤鎵嬫満鍙风櫥褰� 鍙甯� + if (departs == null || departs.size() == 0) { + /*result.error500("鐢ㄦ埛鏆傛湭褰掑睘閮ㄩ棬,涓嶅彲鐧诲綍!"); + return result;*/ + }else{ + orgCode = departs.get(0).getOrgCode(); + sysUser.setOrgCode(orgCode); + this.sysUserService.updateUserDepart(username, orgCode,null); + } + //update-end-author:taoyan date:20220117 for: JTC-1068銆恆pp銆戞柊寤虹敤鎴凤紝娌℃湁璁剧疆閮ㄩ棬鍙婅鑹诧紝鐐瑰嚮鐧诲綍鎻愮ず鏆傛湭褰掑睘閮紝涓�鐩村湪鐧诲綍椤甸潰 浣跨敤鎵嬫満鍙风櫥褰� 鍙甯� + } + + //4. 璁剧疆鐧诲綍绉熸埛 + Result<JSONObject> loginTenantError = sysUserService.setLoginTenant(sysUser, obj, username, result); + if (loginTenantError != null) { + return loginTenantError; + } + + //5. 璁剧疆鐧诲綍鐢ㄦ埛淇℃伅 + obj.put("userInfo", sysUser); + + //6. 鐢熸垚token + String token = JwtUtil.sign(username, syspassword); + // 璁剧疆瓒呮椂鏃堕棿 + redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token); + redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME*2 / 1000); + + //token 淇℃伅 + obj.put("token", token); + result.setResult(obj); + result.setSuccess(true); + result.setCode(200); + baseCommonService.addLog("鐢ㄦ埛鍚�: " + username + ",鐧诲綍鎴愬姛[绉诲姩绔痌锛�", CommonConstant.LOG_TYPE_1, null); + return result; + } + + /** + * 鍥惧舰楠岃瘉鐮� + * @param sysLoginModel + * @return + */ + @RequestMapping(value = "/checkCaptcha", method = RequestMethod.POST) + public Result<?> checkCaptcha(@RequestBody SysLoginModel sysLoginModel){ + String captcha = sysLoginModel.getCaptcha(); + String checkKey = sysLoginModel.getCheckKey(); + if(captcha==null){ + return Result.error("楠岃瘉鐮佹棤鏁�"); + } + String lowerCaseCaptcha = captcha.toLowerCase(); + String realKey = Md5Util.md5Encode(lowerCaseCaptcha+checkKey, "utf-8"); + Object checkCode = redisUtil.get(realKey); + if(checkCode==null || !checkCode.equals(lowerCaseCaptcha)) { + return Result.error("楠岃瘉鐮侀敊璇�"); + } + return Result.ok(); + } + /** + * 鐧诲綍浜岀淮鐮� + */ + @ApiOperation(value = "鐧诲綍浜岀淮鐮�", notes = "鐧诲綍浜岀淮鐮�") + @GetMapping("/getLoginQrcode") + public Result<?> getLoginQrcode() { + String qrcodeId = CommonConstant.LOGIN_QRCODE_PRE+IdWorker.getIdStr(); + //瀹氫箟浜岀淮鐮佸弬鏁� + Map params = new HashMap(5); + params.put("qrcodeId", qrcodeId); + //瀛樻斁浜岀淮鐮佸敮涓�鏍囪瘑30绉掓湁鏁� + redisUtil.set(CommonConstant.LOGIN_QRCODE + qrcodeId, qrcodeId, 30); + return Result.OK(params); + } + /** + * 鎵爜浜岀淮鐮� + */ + @ApiOperation(value = "鎵爜鐧诲綍浜岀淮鐮�", notes = "鎵爜鐧诲綍浜岀淮鐮�") + @PostMapping("/scanLoginQrcode") + public Result<?> scanLoginQrcode(@RequestParam String qrcodeId, @RequestParam String token) { + Object check = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId); + if (oConvertUtils.isNotEmpty(check)) { + //瀛樻斁token缁欏墠鍙拌鍙� + redisUtil.set(CommonConstant.LOGIN_QRCODE_TOKEN+qrcodeId, token, 60); + } else { + return Result.error("浜岀淮鐮佸凡杩囨湡,璇峰埛鏂板悗閲嶈瘯"); + } + return Result.OK("鎵爜鎴愬姛"); + } + + + /** + * 鑾峰彇鐢ㄦ埛鎵爜鍚庝繚瀛樼殑token + */ + @ApiOperation(value = "鑾峰彇鐢ㄦ埛鎵爜鍚庝繚瀛樼殑token", notes = "鑾峰彇鐢ㄦ埛鎵爜鍚庝繚瀛樼殑token") + @GetMapping("/getQrcodeToken") + public Result getQrcodeToken(@RequestParam String qrcodeId) { + Object token = redisUtil.get(CommonConstant.LOGIN_QRCODE_TOKEN + qrcodeId); + Map result = new HashMap(5); + Object qrcodeIdExpire = redisUtil.get(CommonConstant.LOGIN_QRCODE + qrcodeId); + if (oConvertUtils.isEmpty(qrcodeIdExpire)) { + //浜岀淮鐮佽繃鏈熼�氱煡鍓嶅彴鍒锋柊 + result.put("token", "-2"); + return Result.OK(result); + } + if (oConvertUtils.isNotEmpty(token)) { + result.put("success", true); + result.put("token", token); + } else { + result.put("token", "-1"); + } + return Result.OK(result); + } + + /** + * 鐧诲綍澶辫触瓒呭嚭娆℃暟5 杩斿洖true + * @param username + * @return + */ + private boolean isLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + if(failTime!=null){ + Integer val = Integer.parseInt(failTime.toString()); + if(val>5){ + return true; + } + } + return false; + } + + /** + * 璁板綍鐧诲綍澶辫触娆℃暟 + * @param username + */ + private void addLoginFailOvertimes(String username){ + String key = CommonConstant.LOGIN_FAIL + username; + Object failTime = redisUtil.get(key); + Integer val = 0; + if(failTime!=null){ + val = Integer.parseInt(failTime.toString()); + } + // 1灏忔椂 + redisUtil.set(key, ++val, 3600); + } + +} \ No newline at end of file -- Gitblit v1.9.3