springcloud_k8s_panzhihuazhihuishequ/applets_backstage/pom.xml
@@ -64,7 +64,11 @@ <artifactId>minio</artifactId> <version>6.0.8</version> </dependency> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> </dependencies> <build> springcloud_k8s_panzhihuazhihuishequ/applets_backstage/src/main/java/com/panzhihua/applets_backstage/api/KaphtchaApi.java
New file @@ -0,0 +1,80 @@ package com.panzhihua.applets_backstage.api; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.panzhihua.common.controller.BaseController; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.utlis.StringUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.time.Duration; /** * @author zzj */ @Api(tags = {"验证码接口"}) @RestController @RequestMapping("/kaphtcha/") public class KaphtchaApi extends BaseController { @Resource private DefaultKaptcha defaultKaptcha; @Resource private StringRedisTemplate stringRedisTemplate; @ApiOperation("生成验证码") @GetMapping("/verification") public void defaultKaptcha(@RequestParam("uuid")String uuid,HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { byte[] captchaChallengeAsJpeg = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { // 生产验证码字符串并保存到session中,分布式环境存redis中 String createText = defaultKaptcha.createText(); stringRedisTemplate.opsForValue().set("verifyCode_"+uuid,createText, Duration.ofMinutes(5)); // 使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中 BufferedImage challenge = defaultKaptcha.createImage(createText); ImageIO.write(challenge, "jpg", jpegOutputStream); } catch (IllegalArgumentException e) { httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND); return; } // 定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组 captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); httpServletResponse.setHeader("Cache-Control", "no-store"); httpServletResponse.setHeader("Pragma", "no-cache"); httpServletResponse.setDateHeader("Expires", 0); httpServletResponse.setContentType("image/jpeg"); ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream(); responseOutputStream.write(captchaChallengeAsJpeg); responseOutputStream.flush(); responseOutputStream.close(); } @ApiOperation("验证码核对") @GetMapping("/checkVerifyCode") public R checkVerifyCode(@RequestParam("verifyCode")String verifyCode,@RequestParam("uuid")String uuid){ String text=stringRedisTemplate.opsForValue().get("verifyCode_"+uuid); if(StringUtils.isNotEmpty(text)){ if(verifyCode.equals(text)){ stringRedisTemplate.delete("verifyCode_"+uuid); return R.ok(); } return R.fail("验证码错误"); } return R.fail("验证码失效"); } } springcloud_k8s_panzhihuazhihuishequ/applets_backstage/src/main/java/com/panzhihua/applets_backstage/config/KaptchaConfig.java
New file @@ -0,0 +1,45 @@ package com.panzhihua.applets_backstage.config; import com.google.code.kaptcha.Constants; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; /** * @author zzj */ @Configuration public class KaptchaConfig { /** * 验证码配置 * @return */ @Bean public DefaultKaptcha getDefaultKaptcha(){ DefaultKaptcha defaultKaptcha=new DefaultKaptcha(); Properties properties=new Properties(); //是否有边框 properties.setProperty(Constants.KAPTCHA_BORDER,"yes"); //验证码文本颜色 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR,"red"); //验证码图片宽度 properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH,"180"); //验证码图片高度 properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT,"80"); //文本字符大小 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE,"39"); //验证码session的值 properties.setProperty(Constants.KAPTCHA_SESSION_CONFIG_KEY,"kaptchaCode"); //验证码文本长度 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH,"4"); //字体 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体,楷体,微软雅黑"); Config config=new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } } springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/vos/user/ChangePasswordVO.java
@@ -24,7 +24,7 @@ @ApiModelProperty("新密码") @NotBlank(message = "新密码不能为空") @Pattern(message = "密码格式为6-16个字符,英文,数字,且必须包含英文和数字", regexp = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$") @Pattern(message = "密码强度过低,请将密码长度设置为8-16位,且包含字母、数字、字符。", regexp = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*.`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&.*`~()-+=]+$)(?![0-9\\W_!@#$%^.&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&.*`~()-+=]{8,16}$") private String newPassword; @ApiModelProperty(hidden = true, value = "当前登录用户id") springcloud_k8s_panzhihuazhihuishequ/community_backstage/pom.xml
@@ -78,6 +78,12 @@ <!-- <artifactId>jxls-poi</artifactId>--> <!-- <version>1.1.0</version>--> <!-- </dependency>--> <!-- 图片验证码 --> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> </dependencies> <build> springcloud_k8s_panzhihuazhihuishequ/community_backstage/src/main/java/com/panzhihua/community_backstage/api/KaphtchaApi.java
New file @@ -0,0 +1,81 @@ package com.panzhihua.community_backstage.api; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.panzhihua.common.controller.BaseController; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.utlis.StringUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.time.Duration; /** * @author zzj */ @Api(tags = {"验证码接口"}) @RestController @RequestMapping("/kaphtcha/") public class KaphtchaApi extends BaseController { @Resource private DefaultKaptcha defaultKaptcha; @Resource private StringRedisTemplate stringRedisTemplate; @ApiOperation("生成验证码") @GetMapping("/verification") public void defaultKaptcha(@RequestParam("uuid")String uuid,HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { byte[] captchaChallengeAsJpeg = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { // 生产验证码字符串并保存到session中,分布式环境存redis中 String createText = defaultKaptcha.createText(); stringRedisTemplate.opsForValue().set("verifyCode_"+uuid,createText, Duration.ofMinutes(5)); // 使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中 BufferedImage challenge = defaultKaptcha.createImage(createText); ImageIO.write(challenge, "jpg", jpegOutputStream); } catch (IllegalArgumentException e) { httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND); return; } // 定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组 captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); httpServletResponse.setHeader("Cache-Control", "no-store"); httpServletResponse.setHeader("Pragma", "no-cache"); httpServletResponse.setDateHeader("Expires", 0); httpServletResponse.setContentType("image/jpeg"); ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream(); responseOutputStream.write(captchaChallengeAsJpeg); responseOutputStream.flush(); responseOutputStream.close(); } @ApiOperation("验证码核对") @GetMapping("/checkVerifyCode") public R checkVerifyCode(@RequestParam("verifyCode")String verifyCode,@RequestParam("uuid")String uuid){ String text=stringRedisTemplate.opsForValue().get("verifyCode_"+uuid); if(StringUtils.isNotEmpty(text)){ if(verifyCode.equals(text)){ stringRedisTemplate.delete("verifyCode_"+uuid); return R.ok(); } return R.fail("验证码错误"); } return R.fail("验证码失效"); } } springcloud_k8s_panzhihuazhihuishequ/community_backstage/src/main/java/com/panzhihua/community_backstage/config/KaptchaConfig.java
New file @@ -0,0 +1,45 @@ package com.panzhihua.community_backstage.config; import com.google.code.kaptcha.Constants; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; /** * @author zzj */ @Configuration public class KaptchaConfig { /** * 验证码配置 * @return */ @Bean public DefaultKaptcha getDefaultKaptcha(){ DefaultKaptcha defaultKaptcha=new DefaultKaptcha(); Properties properties=new Properties(); //是否有边框 properties.setProperty(Constants.KAPTCHA_BORDER,"yes"); //验证码文本颜色 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR,"red"); //验证码图片宽度 properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH,"180"); //验证码图片高度 properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT,"80"); //文本字符大小 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE,"39"); //验证码session的值 properties.setProperty(Constants.KAPTCHA_SESSION_CONFIG_KEY,"kaptchaCode"); //验证码文本长度 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH,"4"); //字体 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体,楷体,微软雅黑"); Config config=new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } } springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/api/LoginApi.java
@@ -1,15 +1,7 @@ package com.panzhihua.shop_backstage.api; import javax.annotation.Resource; import org.springframework.beans.BeanUtils; import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import com.alibaba.fastjson.JSONObject; import com.panzhihua.common.controller.BaseController; import com.panzhihua.common.interfaces.ShopOperLog; import com.panzhihua.common.model.vos.LoginReturnVO; import com.panzhihua.common.model.vos.LoginUserInfoVO; import com.panzhihua.common.model.vos.R; @@ -19,11 +11,17 @@ import com.panzhihua.common.service.auth.TokenService; import com.panzhihua.common.service.community.CommunityService; import com.panzhihua.common.service.user.UserService; import com.panzhihua.common.interfaces.ShopOperLog; import com.panzhihua.shop_backstage.model.vos.LoginBody; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @Slf4j @RestController @@ -40,21 +38,20 @@ @ApiOperation(value = "商家后台登录", response = LoginReturnVO.class) @ShopOperLog(operType = 1) @PostMapping("login") public R login(@RequestBody LoginBody loginBody) { public R login(@RequestBody LoginBody loginBody){ String account = loginBody.getAccount(); String password = loginBody.getPassword(); boolean empty = ObjectUtils.isEmpty(account); boolean empty1 = ObjectUtils.isEmpty(password); if (empty || empty1) { if (empty||empty1) { return R.fail("账户密码不能为空"); } log.info("登录用户信息【{}】", loginBody); log.info("登录用户信息【{}】",loginBody); try { R<ShopStoreVO> storeR = communityService.getUserStoreInfoByAccount(account); if (R.isOk(storeR)) { ShopStoreVO shopStoreVO = JSONObject.parseObject(JSONObject.toJSONString(storeR.getData()), ShopStoreVO.class); if(R.isOk(storeR)) { ShopStoreVO shopStoreVO = JSONObject.parseObject(JSONObject.toJSONString(storeR.getData()), ShopStoreVO.class); Boolean accountValid = shopStoreVO.getStatus() == 1; if (accountValid) { R r = tokenService.loginShopBackStage(account, password); @@ -64,7 +61,7 @@ } } return R.fail(storeR.getMsg()); } catch (Exception e) { }catch (Exception e){ return R.fail("登陆失败了"); } } @@ -72,10 +69,10 @@ @ApiOperation(value = "修改密码") @PutMapping("changepassword") @ShopOperLog(operType = 2) public R changePassword(@Validated @RequestBody ChangePasswordVO changePasswordVO) { public R changePassword(@Validated @RequestBody ChangePasswordVO changePasswordVO){ Long userId = this.getUserId(); String newPassword = changePasswordVO.getNewPassword(); String oldPassword = changePasswordVO.getOldPassword(); String oldPassword=changePasswordVO.getOldPassword(); if (newPassword.equals(oldPassword)) { return R.fail("修改失败,新密码和原密码一致"); } @@ -83,26 +80,24 @@ return userService.changePassword(changePasswordVO); } @ApiOperation(value = "当前登录用户信息", response = LoginStoreUserInfoVO.class) @ApiOperation(value = "当前登录用户信息",response = LoginStoreUserInfoVO.class) @GetMapping("user") public R detailUser() { public R detailUser(){ Long userId = this.getUserId(); R<LoginUserInfoVO> loginUserInfoVOR = userService.detailUser(userId); try { LoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(JSONObject.toJSONString(loginUserInfoVOR.getData()), LoginUserInfoVO.class); LoginUserInfoVO loginUserInfoVO = JSONObject.parseObject(JSONObject.toJSONString(loginUserInfoVOR.getData()), LoginUserInfoVO.class); loginUserInfoVO.setPassword("******"); R<ShopStoreVO> storeR = communityService.getUserStoreInfo(userId); LoginStoreUserInfoVO loginStoreUserInfoVO = new LoginStoreUserInfoVO(); BeanUtils.copyProperties(loginUserInfoVO, loginStoreUserInfoVO); if (R.isOk(storeR) && storeR.getData() != null) { ShopStoreVO shopStoreVO = JSONObject.parseObject(JSONObject.toJSONString(storeR.getData()), ShopStoreVO.class); if (R.isOk(storeR)&& storeR.getData()!=null) { ShopStoreVO shopStoreVO = JSONObject.parseObject(JSONObject.toJSONString(storeR.getData()), ShopStoreVO.class); loginStoreUserInfoVO.setStoreInfo(shopStoreVO); } return R.ok(loginStoreUserInfoVO); } catch (Exception e) { }catch (Exception e){ e.printStackTrace(); return R.fail("获取登陆商家用户信息失败"); } springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/api/MicroCommercialStreetApi.java
@@ -1,79 +1,41 @@ package com.panzhihua.shop_backstage.api; import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import java.util.regex.Pattern; import javax.annotation.Resource; import javax.validation.Valid; import org.springframework.beans.BeanUtils; import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import com.panzhihua.common.controller.BaseController; import com.panzhihua.common.model.dtos.community.microCommercialStreet.BindUserPhoneDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.DeleteProductDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.LoginWithPhoneDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.McsEvaluateDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.McsGameDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.McsInfoDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.McsMerchantDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.McsProductDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.PageJoinGameListDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.PageMcsEvaluateDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.PageMcsGameDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.PageMcsInformationDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.PageMcsMerchantDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.PageMcsProductDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.PageVerifyRecordDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.PutUserInfoDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.SetShelfForGameDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.SetShelfForInfoDTO; import com.panzhihua.common.model.dtos.community.microCommercialStreet.SetShelfForProductDTO; import com.panzhihua.common.exceptions.ServiceException; import com.panzhihua.common.model.dtos.community.microCommercialStreet.*; import com.panzhihua.common.model.vos.LoginReturnVO; import com.panzhihua.common.model.vos.LoginUserInfoVO; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.community.microCommercialStreet.GameStatisticsVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.IndexTopStatisticsVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsConfigVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsCouponVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsEvaluateVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsGameVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsInformationVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsLabelVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsLoginUserInfoVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsMerchantVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsProductVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.McsVerifyRecordVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.MyCouponVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.TopStatisticsVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.VerifiedReturnVO; import com.panzhihua.common.model.vos.community.microCommercialStreet.*; import com.panzhihua.common.service.auth.TokenService; import com.panzhihua.common.service.community.CommunityService; import com.panzhihua.common.service.user.UserService; import com.panzhihua.common.validated.AddGroup; import com.panzhihua.common.validated.PutGroup; import com.panzhihua.shop_backstage.aop.CheckMcsMerchantExpiration; import com.panzhihua.shop_backstage.config.MyAESUtil; import com.panzhihua.shop_backstage.config.WxMaConfiguration; import com.panzhihua.shop_backstage.model.request.LoginRequest; import com.panzhihua.shop_backstage.model.vos.LoginBody; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.util.ObjectUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.time.Duration; import java.util.regex.Pattern; import static java.util.Objects.isNull; import static java.util.Objects.nonNull; /** * @title: MicroCommercialStreetApi @@ -88,6 +50,7 @@ @Slf4j public class MicroCommercialStreetApi extends BaseController { private static String LOGIN_FAIL = "LOGIN_FAIL_"; @Resource private CommunityService communityService; @Resource @@ -96,6 +59,8 @@ private UserService userService; @Resource private WxMaConfiguration wxMaConfiguration; @Resource private RedisTemplate redisTemplate; @ApiOperation(value = "H5授权登录", response = LoginReturnVO.class) @PostMapping("/auth/login") @@ -159,7 +124,14 @@ @PostMapping("/merchant/login") public R merchantLogin(@RequestBody @Valid LoginBody loginBody) { String account = loginBody.getAccount(); String password = loginBody.getPassword(); log.info("登录用户信息【{}】", loginBody); try { password = MyAESUtil.Decrypt(loginBody.getPassword(), "Ryo7M3n8loC5Abcd"); } catch (Exception e) { return R.fail("账号或密码错误!"); } boolean flag = redisTemplate.hasKey(LOGIN_FAIL + account); try { R r = communityService.getMcsMerchantByAccount(account); Boolean isValid = false; @@ -167,7 +139,14 @@ McsMerchantVO merchantVO = JSONObject.parseObject(JSONObject.toJSONString(r.getData()), McsMerchantVO.class); isValid = merchantVO.getAccountStatus() == 1; if (isValid) { R result = tokenService.loginMcsUser(account, loginBody.getPassword()); if (flag) { Integer time = (Integer) redisTemplate.opsForValue().get(LOGIN_FAIL + account); if (time >= 5) { redisTemplate.opsForValue().set(LOGIN_FAIL + account, 5, Duration.ofMinutes(5)); throw new ServiceException("登录错误超过限制,请五分钟后重试"); } } R result = tokenService.loginMcsUser(account, password); return result; } else { return R.fail("账号被禁用"); @@ -175,10 +154,20 @@ } return R.fail(r.getMsg()); } catch (Exception e) { lockLogin(flag, account); return R.fail("登陆失败了"); } } private void lockLogin(Boolean flag, String userName) { if (flag) { Integer time = (Integer) redisTemplate.opsForValue().get(LOGIN_FAIL + userName); redisTemplate.opsForValue().set(LOGIN_FAIL + userName, time + 1, Duration.ofMinutes(5)); } else { redisTemplate.opsForValue().set(LOGIN_FAIL + userName, 1, Duration.ofMinutes(5)); } } @ApiOperation(value = "微商业街用户登录", response = LoginReturnVO.class) @PostMapping("/loginWithPhone") public R loginWithPhone(@RequestBody @Valid LoginWithPhoneDTO loginDTO) { springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/config/AuthConfig.java
New file @@ -0,0 +1,25 @@ package com.panzhihua.shop_backstage.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * 读取项目相关配置 * * @author huanghongfa */ @Data @Component @ConfigurationProperties(prefix = "auth") public class AuthConfig { /** 上传路径 */ public static String profile; /** 获取地址开关 */ public static boolean addressEnabled; /** 项目名称 */ public String name; /** 版本 */ public String version; } springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/config/MyAESUtil.java
New file @@ -0,0 +1,52 @@ package com.panzhihua.shop_backstage.config; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class MyAESUtil { // 加密 public static String Encrypt(String sSrc, String sKey) throws Exception { if (sKey == null) { System.out.print("Key为空null"); return null; } // 判断Key是否为16位 if (sKey.length() != 16) { System.out.print("Key长度不是16位"); return null; } byte[] raw = sKey.getBytes("utf-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式" cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8")); return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。 } // 解密 public static String Decrypt(String sSrc, String sKey) throws Exception { try { byte[] raw = sKey.getBytes("utf-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);//先用base64解密 try { byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original,"utf-8"); return originalString; } catch (Exception e) { System.out.println(e.toString()); return null; } } catch (Exception ex) { System.out.println(ex.toString()); return null; } } } springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java
@@ -87,6 +87,8 @@ boolean refreshToken = requestURI.contains("refreshToken"); boolean logout = requestURI.contains("logout"); boolean wxPay = requestURI.contains("wxNotify"); boolean kaphtcha = requestURI.contains("kaphtcha"); boolean uuRepay = requestURI.contains("uuRepay"); boolean wxCgi = requestURI.contains("cgi"); boolean isShop = requestURI.contains("isShop"); boolean noToken = requestURI.contains("noToken"); @@ -100,7 +102,7 @@ SafeboxRequestWrapper safeboxRequestWrapper = new SafeboxRequestWrapper(request); if (login || doc || css || js || ui || swagger || ico || docs || error || refreshToken || useragreement || wxPay // ||wxCgi||isShop||listadvertisement||noToken||bigscreen) { || wxCgi || isShop || listadvertisement || noToken) { || wxCgi || isShop || listadvertisement || noToken||uuRepay||kaphtcha) { // 什么也不做 } else { // 获取请求头中JWT的Token