ycl-common/src/main/java/com/ycl/bo/AdminUserDetails.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-common/src/main/java/com/ycl/controller/user/UmsAdminController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-common/src/main/java/com/ycl/utils/AesEncryptUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-common/src/main/resources/mapper/user/UmsAdminMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-platform/src/main/resources/application-dev.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ycl-common/src/main/java/com/ycl/bo/AdminUserDetails.java
@@ -13,6 +13,7 @@ /** * SpringSecurity需要的用户详情 */ public class AdminUserDetails implements UserDetails { private UmsAdmin umsAdmin; private List<UmsMenu> resourceList; @@ -63,4 +64,8 @@ public Long getUserId() { return umsAdmin.getId(); } public UmsAdmin getUmsAdmin() { return umsAdmin; } } ycl-common/src/main/java/com/ycl/controller/user/UmsAdminController.java
@@ -24,6 +24,7 @@ import com.ycl.service.redis.RedisService; import com.ycl.service.user.UmsAdminService; import com.ycl.service.user.UmsMenuService; import com.ycl.utils.AesEncryptUtil; import com.ycl.utils.EasyExcelUtils; import com.ycl.utils.redis.RedisKey; import com.ycl.vo.user.UserVO; @@ -80,8 +81,11 @@ @ApiOperation(value = "登录以后返回token") @RequestMapping(value = "/login", method = RequestMethod.POST) @ResponseBody public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) { String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword()); public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) throws Exception { String password = AesEncryptUtil.desEncrypt(umsAdminLoginParam.getPassword()); // String password = umsAdminLoginParam.getPassword(); String token = adminService.login(umsAdminLoginParam.getUsername(), password); if (token == null) { return CommonResult.validateFailed("用户名或密码错误"); } @@ -161,6 +165,7 @@ private DataDictionary2Mapper dataDictionary2Mapper; @Resource private UmsDepartMapper umsDepartMapper; @ApiOperation("用户导入") @PostMapping("/import") public CommonResult importUser(MultipartFile file) throws IOException { @@ -175,20 +180,20 @@ param.setNickName(item.getNickName()); String sex = item.getSex(); if (sex.equals("男")){ if (sex.equals("男")) { param.setSex((byte) 1); } else if (sex.equals("女")) { param.setSex((byte) 0); }else { } else { throw new RuntimeException("性别输入有误"); } String isDy = item.getIsDy(); if (isDy.equals("是")){ if (isDy.equals("是")) { param.setSex((byte) 1); } else if (isDy.equals("否")) { param.setSex((byte) 0); }else { } else { throw new RuntimeException("党员输入有误"); } @@ -197,9 +202,9 @@ String role = item.getRole(); UmsRole umsRole = umsRoleMapper.selectOne(new LambdaQueryWrapper<UmsRole>().eq(UmsRole::getName, role)); if (Objects.isNull(umsRole)){ if (Objects.isNull(umsRole)) { param.setRoleIds(null); }else { } else { List list = new ArrayList<>(); list.add(umsRole.getId()); param.setRoleIds(list); @@ -207,17 +212,17 @@ String userType = item.getUserType(); DataDictionary dataDictionary = dataDictionary2Mapper.selectOne(new LambdaQueryWrapper<DataDictionary>().eq(DataDictionary::getName, userType)); if (Objects.isNull(dataDictionary)){ if (Objects.isNull(dataDictionary)) { throw new RuntimeException("用户类型不存在"); }else { } else { param.setUserType(dataDictionary.getId().intValue()); } String department = item.getDepartment(); UmsDepart umsDepart = umsDepartMapper.selectOne(new LambdaQueryWrapper<UmsDepart>().eq(UmsDepart::getDepartName, department)); if (Objects.isNull(umsDepart)){ if (Objects.isNull(umsDepart)) { throw new RuntimeException("部门不存在"); }else { } else { param.setDepartmentId(umsDepart.getId()); } @@ -234,7 +239,6 @@ }).sheet().doRead(); return CommonResult.success(true, "导入成功"); } @ApiOperation("获取指定用户信息") @@ -271,7 +275,7 @@ return CommonResult.failed("找不到该用户"); } else if (status == -3) { return CommonResult.failed("旧密码错误"); }else if (status == -4) { } else if (status == -4) { return CommonResult.failed("密码不能和登录名完全一致"); } else { return CommonResult.failed(); ycl-common/src/main/java/com/ycl/entity/user/UmsAdmin.java
@@ -10,8 +10,10 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.*; import org.joda.time.DateTime; import java.io.Serializable; import java.time.LocalDateTime; import java.util.Date; import java.util.List; @@ -99,6 +101,14 @@ @ApiModelProperty(value = "是否为网格管理员:0->不是;1->是") private Integer isGrid; @ApiModelProperty(value = "是否为网格管理员:0->不是;1->是") @TableField("password_error_num") private Integer passwordErrorNum; @ApiModelProperty(value = "是否为网格管理员:0->不是;1->是") @TableField("password_error_last_time") private LocalDateTime passwordErrorLastTime; @ApiModelProperty(value = "关键字段") @TableField(exist = false) private String keyword; ycl-common/src/main/java/com/ycl/service/user/impl/UmsAdminServiceImpl.java
@@ -1,6 +1,7 @@ package com.ycl.service.user.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.util.PageUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.druid.sql.PagerUtils; @@ -49,6 +50,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -258,12 +260,31 @@ //密码需要客户端加密后传递 try { AdminUserDetails userDetails = (AdminUserDetails) loadUserByUsername(username); UmsAdmin admin = userDetails.getUmsAdmin(); LocalDateTime nowTime = LocalDateTime.now(); nowTime = nowTime.plusMinutes(-15); if (admin.getPasswordErrorNum() != null && admin.getPasswordErrorNum() >= 5 && admin.getPasswordErrorLastTime().isAfter(nowTime)) { admin.setPasswordErrorLastTime(LocalDateTime.now()); updateById(admin); Asserts.fail("登录失败超过5次,此账号被锁定,请15分钟后再试。"); } if (!passwordEncoder.matches(password, userDetails.getPassword())) { if (admin.getPasswordErrorNum() == null) { admin.setPasswordErrorNum(1); } else { admin.setPasswordErrorNum(admin.getPasswordErrorNum() + 1); } admin.setPasswordErrorLastTime(LocalDateTime.now()); updateById(admin); Asserts.fail("密码不正确"); } if (!userDetails.isEnabled()) { Asserts.fail("帐号已被禁用"); } admin.setPasswordErrorNum(0); updateById(admin); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authentication); @@ -430,7 +451,7 @@ List<UmsMenu> resourceList = getResourceList(admin.getId()); return new AdminUserDetails(admin, resourceList); } throw new UsernameNotFoundException("用户名或密码错误"); throw new UsernameNotFoundException("用户不存在"); } @Override ycl-common/src/main/java/com/ycl/utils/AesEncryptUtil.java
New file @@ -0,0 +1,100 @@ package com.ycl.utils; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AesEncryptUtil { //使用AES-128-CBC加密模式,key需要为16位,key和iv可以相同! private static String KEY = "1234567890123456"; private static String IV = "1234567890123456"; /** * 加密方法 * @param data 要加密的数据 * @param key 加密key * @param iv 加密iv * @return 加密的结果 * @throws Exception */ public static String encrypt(String data, String key, String iv) throws Exception { try { Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");//"算法/模式/补码方式"NoPadding PkcsPadding int blockSize = cipher.getBlockSize(); byte[] dataBytes = data.getBytes(); int plaintextLength = dataBytes.length; if (plaintextLength % blockSize != 0) { plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); } byte[] plaintext = new byte[plaintextLength]; System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); byte[] encrypted = cipher.doFinal(plaintext); return new Base64().encodeToString(encrypted); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 解密方法 * @param data 要解密的数据 * @param key 解密key * @param iv 解密iv * @return 解密的结果 * @throws Exception */ public static String desEncrypt(String data, String key, String iv) throws Exception { try { byte[] encrypted1 = new Base64().decode(data); Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original); return originalString.trim(); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 使用默认的key和iv加密 * @param data * @return * @throws Exception */ public static String encrypt(String data) throws Exception { return encrypt(data, KEY, IV); } /** * 使用默认的key和iv解密 * @param data * @return * @throws Exception */ public static String desEncrypt(String data) throws Exception { return desEncrypt(data, KEY, IV); } } ycl-common/src/main/resources/mapper/user/UmsAdminMapper.xml
@@ -23,6 +23,8 @@ <result column="zj" property="zj"/> <result column="mobile" property="mobile"/> <result column="expiration_date" property="expirationDate"/> <result column="password_error_num" property="passwordErrorNum"/> <result column="password_error_last_time" property="passwordErrorLastTime" /> </resultMap> <resultMap type="com.ycl.entity.user.UmsAdmin" id="CondMapResultMap" extends="BaseResultMap"> <collection property="depart" javaType="ArrayList" ofType="com.ycl.entity.depart.UmsDepart"> ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
@@ -1,6 +1,7 @@ package com.ycl.controller.platformApi; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.ycl.annotation.LogSave; import com.ycl.api.CommonResult; import com.ycl.dto.video.AlarmParam; import com.ycl.enums.common.ResultCode; @@ -46,6 +47,7 @@ @ApiOperation("视频报警推送API") @PostMapping("/AlarmReport") @LogSave(operationType = "报警管理", contain = "视频报警推送") public CommonResult alarmReport(@RequestBody @Validated AlarmParam alarmParam) { videoAlarmReportService.save(alarmParam); return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage()); ycl-platform/src/main/resources/application-dev.yml
@@ -35,7 +35,7 @@ timeout: 0 datasource: url: jdbc:mysql://42.193.1.25:3306/sccg0318?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false url: jdbc:mysql://42.193.1.25:3306/sccg?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false username: root password: 321$YcYl@1970! type: com.alibaba.druid.pool.DruidDataSource