hurixing 2 лет назад
Родитель
Сommit
2fc921c4e8

+ 4 - 4
hcp-app/src/main/resources/application-dev.yml

@@ -58,8 +58,8 @@ jwt:
   tokenHeader: userToken
   tokenPrefix: Bearer
   secret: 123456
-  expiration: 604800
-  rememberExpiration: 604800
+  expiration: 60
+  rememberExpiration: 60
 
 mybatis-plus:
   config-location: classpath:mybatis-config.xml
@@ -76,7 +76,7 @@ oss:
   access-key-secret: Ju8eTnJdHa6nZJuDPfee2eQJQvuVuw
   bucket-name: hcp-yaorong
   endpoint:  oss-cn-beijing.aliyuncs.com #填写自己oss endpoint
-  outDomain: http://yaorongoss.yingyangfly.com #填写自己oss 外网域名
+  outDomain: https://yaorongoss.yaorongmedical.com #填写自己oss 外网域名
 
 live:
   stream: 187278.push.tlivecloud.com
@@ -101,6 +101,6 @@ baidu:
   appId: 55480265
   apiKey: px002Mxrj5K2CGyanMoQUcZU
   secretKey: hiD6uuvNgRchMF0WVK3GN4bMxcmkq9Zt
-query-daily-trai: https://www.yingyangfly.com/h5-training-daily/index.html
+query-daily-trai: https://yaorong.yaorongmedical.com/h5-training-daily/index.html
 
 review-task-space: 30

+ 22 - 0
hcp-core/src/main/java/com/yingyangfly/core/enums/RedisStatusEnums.java

@@ -0,0 +1,22 @@
+package com.yingyangfly.core.enums;
+
+public enum RedisStatusEnums {
+
+    REDIS_EXPIRATION_TIME_1(1800,"后台登录token过期时间");
+    private final Integer code;
+    private final String info;
+
+    RedisStatusEnums(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public Integer getCode()
+    {
+        return code;
+    }
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 17 - 0
hcp-core/src/main/java/com/yingyangfly/core/security/filter/JwtAuthenticationFilter.java

@@ -1,13 +1,20 @@
 package com.yingyangfly.core.security.filter;
 
+import cn.hutool.json.JSONUtil;
+import com.yingyangfly.common.dto.ResultResponse;
+import com.yingyangfly.core.enums.RedisStatusEnums;
 import com.yingyangfly.core.security.util.JwtUtil;
 import com.yingyangfly.core.security.util.TokenUtil;
+import com.yingyangfly.redis.client.RedisClient;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.web.filter.OncePerRequestFilter;
+
+import javax.annotation.Resource;
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -30,6 +37,9 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
     @Autowired
     UserDetailsService userDetailsService;
 
+    @Resource
+    private RedisClient redisClient;
+
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
         String authHeader = request.getHeader(jwtUtil.getJwtProperties().getTokenHeader());
@@ -39,10 +49,17 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
             chain.doFilter(request, response);
             return;
         }
+        String tokenInRedis = redisClient.get(username, "");
+        if (ObjectUtils.isEmpty(tokenInRedis)){
+            response.getWriter().println(JSONUtil.parse(ResultResponse.fail(String.valueOf(HttpServletResponse.SC_UNAUTHORIZED),"没有权限")));
+            response.getWriter().flush();
+            return;
+        }
         try {
             UserDetails userDetails = userDetailsService.loadUserByUsername(username);
             if (jwtUtil.validateToken(authToken, userDetails)) {
                 tokenUtil.setCurrentUser(userDetails,request);
+                redisClient.set(username,authHeader, RedisStatusEnums.REDIS_EXPIRATION_TIME_1.getCode());
             }
         } catch (Exception e) {
             log.error(e.getMessage());

+ 11 - 0
hcp-core/src/main/java/com/yingyangfly/core/service/impl/AppUserService.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -17,6 +18,7 @@ import com.yingyangfly.common.utils.DateUtils;
 import com.yingyangfly.core.api.ImApi;
 import com.yingyangfly.core.domain.*;
 import com.yingyangfly.core.dto.*;
+import com.yingyangfly.core.enums.RedisStatusEnums;
 import com.yingyangfly.core.enums.StatusEnums;
 import com.yingyangfly.core.mapper.*;
 import com.yingyangfly.core.recommend.RecommendFacade;
@@ -500,6 +502,15 @@ public class AppUserService extends ServiceImpl<AppUserMapper, AppUser> implemen
             }
         }
         String token = tokenUtil.generateToken(userDetails, false);
+
+        // 判断是否存在旧的token,存在删除
+        String oldToken = redisClient.get(mobile, "");
+        if (ObjectUtils.isNotNull(oldToken)){
+            redisClient.del(mobile);
+        }
+        // 将生成的token 存储到redis中并设置过期时间
+        redisClient.set(mobile,token, RedisStatusEnums.REDIS_EXPIRATION_TIME_1.getCode());
+
         //记录登录历史
         LoginRecord loginRecord = new LoginRecord();
         loginRecord.setCreateTime(new Date());

+ 16 - 1
hcp-core/src/main/java/com/yingyangfly/core/service/impl/SysUserService.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -15,6 +16,7 @@ import com.yingyangfly.common.exception.ServiceException;
 import com.yingyangfly.common.utils.DateUtils;
 import com.yingyangfly.core.domain.*;
 import com.yingyangfly.core.dto.LoginDto;
+import com.yingyangfly.core.enums.RedisStatusEnums;
 import com.yingyangfly.core.enums.StatusEnums;
 import com.yingyangfly.core.mapper.SysRoleMapper;
 import com.yingyangfly.core.mapper.SysUserMapper;
@@ -25,6 +27,7 @@ import com.yingyangfly.core.service.impl.SysDictDataService;
 import com.yingyangfly.core.service.impl.SysMenuService;
 import com.yingyangfly.core.service.impl.SysOrgService;
 import com.yingyangfly.core.util.Sm4Util;
+import com.yingyangfly.redis.client.RedisClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -33,6 +36,7 @@ import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -61,6 +65,9 @@ public class SysUserService extends  ServiceImpl<SysUserMapper,SysUser> {
     CacheUserService cacheUserService;
     @Autowired
     SysDictDataService sysDictDataService;
+
+    @Resource
+    private RedisClient redisClient;
     /**
      * 登录
      * @param dto
@@ -72,7 +79,15 @@ public class SysUserService extends  ServiceImpl<SysUserMapper,SysUser> {
             throw new BadCredentialsException("密码不正确");
         }
         tokenUtil.setAuthentication(userDetails);
-        return tokenUtil.generateToken(userDetails,dto.getRememberMe());
+        String token = tokenUtil.generateToken(userDetails, dto.getRememberMe());
+        // 判断是否存在旧的token,存在删除
+        String oldToken = redisClient.get(dto.getLoginName(), "");
+        if (ObjectUtils.isNotNull(oldToken)){
+            redisClient.del(dto.getLoginName());
+        }
+        // 将生成的token 存储到redis中并设置过期时间
+        redisClient.set(dto.getLoginName(),token, RedisStatusEnums.REDIS_EXPIRATION_TIME_1.getCode());
+        return token;
     }
 
     /**

+ 48 - 0
hcp-core/src/main/java/com/yingyangfly/core/util/PasswordValidator.java

@@ -0,0 +1,48 @@
+package com.yingyangfly.core.util;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * 强密码判断
+ */
+@Component
+public class PasswordValidator {
+
+    private static final int MIN_LENGTH = 8; // 最小长度
+    private static final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+    private static final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz";
+    private static final String DIGITS = "0123456789";
+    private static final String SPECIAL_CHARS = "!@#$%^&*";
+
+    public static boolean isStrongPassword(String password) {
+        if (password == null || password.length() < MIN_LENGTH) {
+            return false;
+        }
+
+        boolean hasUpper = false;
+        boolean hasLower = false;
+        boolean hasDigit = false;
+        boolean hasSpecialChar = false;
+
+        for (char c : password.toCharArray()) {
+            if (UPPERCASE.contains(String.valueOf(c))) {
+                hasUpper = true;
+            } else if (LOWERCASE.contains(String.valueOf(c))) {
+                hasLower = true;
+            } else if (DIGITS.contains(String.valueOf(c))) {
+                hasDigit = true;
+            } else if (SPECIAL_CHARS.contains(String.valueOf(c))) {
+                hasSpecialChar = true;
+            }
+
+            // 如果密码已经包含了所有必要字符,则不需要再检查剩下的字符
+            if (hasUpper && hasLower && hasDigit && hasSpecialChar) {
+                return true;
+            }
+        }
+
+        // 检查是否所有必要的字符类型都已被找到
+        return hasUpper && hasLower && hasDigit && hasSpecialChar;
+    }
+
+}

+ 1 - 1
hcp-core/src/main/java/com/yingyangfly/core/util/WXPayUtil.java

@@ -162,7 +162,7 @@ public class WXPayUtil {
         OrgMerchant orgMerchant = orgMerchantService.selectOne(orgMer);
         String privateKey = orgMerchant.getPrivateKey().replace("-----BEGIN PRIVATE KEY-----", "")
                 .replace("-----END PRIVATE KEY-----", "")
-                .replaceAll("\\s+", "");;
+                .replaceAll("\\s+", "");
         String appId= orgMerchant.getAppId();
         String mchId = orgMerchant.getMchId();
         String mchSerialNo= orgMerchant.getMchSerialNo();

+ 5 - 5
hcp-large-screen/src/main/resources/application-dev.yml

@@ -22,9 +22,9 @@ spring:
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     name: master
-    url: jdbc:mysql://47.93.254.212:3306/hcp?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+    url: jdbc:mysql://localhost:3306/hcp0524?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
     username: root
-    password: SkyMedic$240307
+    password: root
     driver-class-name: com.mysql.cj.jdbc.Driver
     filters: stat
     maxActive: 100
@@ -74,9 +74,9 @@ logging:
 oss:
   access-key-id: LTAI5tCEQ1So2i2GehVRk6Er
   access-key-secret: Ju8eTnJdHa6nZJuDPfee2eQJQvuVuw
-  bucket-name: game377
+  bucket-name: hcp-yaorong
   endpoint:  oss-cn-beijing.aliyuncs.com #填写自己oss endpoint
-  outDomain: http://yaorongoss.yingyangfly.com #填写自己oss 外网域名
+  outDomain: https://yaorongoss.yaorongmedical.com #填写自己oss 外网域名
 live:
   stream: 187278.push.tlivecloud.com
   broadcast: pull.dustlee.com
@@ -100,6 +100,6 @@ baidu:
   appId: 55480265
   apiKey: px002Mxrj5K2CGyanMoQUcZU
   secretKey: hiD6uuvNgRchMF0WVK3GN4bMxcmkq9Zt
-query-daily-trai: https://www.yingyangfly.com/h5-training-daily/index.html
+query-daily-trai: https://yaorong.yaorongmedical.com/h5-training-daily/index.html
 
 review-task-space: 30

+ 8 - 0
hcp-platform/src/main/java/com/yingyangfly/platform/controller/DoctorController.java

@@ -1,11 +1,13 @@
 package com.yingyangfly.platform.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.yingyangfly.common.dto.ResultResponse;
 import com.yingyangfly.common.log.annotation.TraceLog;
 import com.yingyangfly.core.domain.SysUser;
 import com.yingyangfly.core.dto.IdDto;
 import com.yingyangfly.core.service.impl.SysUserService;
+import com.yingyangfly.core.util.PasswordValidator;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -34,6 +36,12 @@ public class DoctorController {
     @PostMapping("/save")
     @TraceLog
     public ResultResponse save(@RequestBody SysUser user){
+        if (ObjectUtils.isNotNull(user.getPassword())) {
+            boolean strongPassword = PasswordValidator.isStrongPassword(user.getPassword());
+            if (!strongPassword){
+                return ResultResponse.fail("用户密码长度必须大于8位数小于20位数且包含大小写字母,数字,特殊字符(!@#$%^&*)");
+            }
+        }
         user.setRoleCodes("doctor");
         sysUserService.saveSysUser(user);
         return ResultResponse.success();

+ 8 - 0
hcp-platform/src/main/java/com/yingyangfly/platform/controller/TherapistsController.java

@@ -1,11 +1,13 @@
 package com.yingyangfly.platform.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.yingyangfly.common.dto.ResultResponse;
 import com.yingyangfly.common.log.annotation.TraceLog;
 import com.yingyangfly.core.domain.SysUser;
 import com.yingyangfly.core.dto.IdDto;
 import com.yingyangfly.core.service.impl.SysUserService;
+import com.yingyangfly.core.util.PasswordValidator;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -34,6 +36,12 @@ public class TherapistsController {
     @PostMapping("/save")
     @TraceLog
     public ResultResponse save(@RequestBody SysUser user){
+        if (ObjectUtils.isNotNull(user.getPassword())){
+            boolean strongPassword = PasswordValidator.isStrongPassword(user.getPassword());
+            if (!strongPassword){
+                return ResultResponse.fail("用户密码长度必须大于8位数小于20位数且包含大小写字母,数字,特殊字符(!@#$%^&*)");
+            }
+        }
         user.setRoleCodes("therapists");
         sysUserService.saveSysUser(user);
         return ResultResponse.success();

+ 17 - 0
hcp-platform/src/main/java/com/yingyangfly/platform/sys/controller/SysUserController.java

@@ -1,16 +1,19 @@
 package com.yingyangfly.platform.sys.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.yingyangfly.common.dto.ResultResponse;
 import com.yingyangfly.common.log.annotation.TraceLog;
 import com.yingyangfly.core.domain.SysUser;
 import com.yingyangfly.core.security.util.TokenUtil;
 import com.yingyangfly.core.service.impl.SysUserService;
 import com.yingyangfly.core.dto.CurrentLoginUser;
+import com.yingyangfly.core.util.PasswordValidator;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.util.Map;
 
 /**
@@ -43,6 +46,12 @@ public class SysUserController {
     @PostMapping("/save")
     @TraceLog
     public ResultResponse save(@RequestBody SysUser sysUser) {
+        if (ObjectUtils.isNotNull(sysUser.getPassword())) {
+            boolean strongPassword = PasswordValidator.isStrongPassword(sysUser.getPassword());
+            if (!strongPassword){
+                return ResultResponse.fail("用户密码长度必须大于8位数小于20位数且包含大小写字母,数字,特殊字符(!@#$%^&*)");
+            }
+        }
         String token = sysUserService.saveSysUser(sysUser);
         return ResultResponse.success(token);
     }
@@ -82,6 +91,10 @@ public class SysUserController {
         Long id = Long.parseLong(params.get("id"));
         String pwd =  params.get("pwd");
         String pwdOld =  params.get("pwdOld");
+        boolean strongPassword = PasswordValidator.isStrongPassword(pwd);
+        if (!strongPassword){
+            return ResultResponse.fail("用户密码长度必须大于8位数小于20位数且包含大小写字母,数字,特殊字符(!@#$%^&*)");
+        }
         return sysUserService.resetPwd(id, pwd, pwdOld);
     }
 
@@ -95,6 +108,10 @@ public class SysUserController {
 
         Long id = Long.parseLong(params.get("id"));
         String pwd =  params.get("pwd");
+        boolean strongPassword = PasswordValidator.isStrongPassword(pwd);
+        if (!strongPassword){
+            return ResultResponse.fail("用户密码长度必须大于8位数小于20位数且包含大小写字母,数字,特殊字符(!@#$%^&*)");
+        }
         return sysUserService.violentResetPwd(id, pwd);
     }
     /**

+ 3 - 3
hcp-platform/src/main/resources/application-dev.yml

@@ -58,7 +58,7 @@ jwt:
   tokenHeader: userToken
   tokenPrefix: Bearer
   secret: 123456
-  expiration: 60
+  expiration: 604800
   rememberExpiration: 604800
 
 mybatis-plus:
@@ -71,7 +71,7 @@ oss:
   access-key-secret: Ju8eTnJdHa6nZJuDPfee2eQJQvuVuw
   bucket-name: hcp-yaorong
   endpoint:  oss-cn-beijing.aliyuncs.com #填写自己oss endpoint
-  outDomain: http://yaorongoss.yingyangfly.com #填写自己oss 外网域名
+  outDomain: https://yaorongoss.yaorongmedical.com #填写自己oss 外网域名
 wx:
   app-id: 填写自己微信支付key
   app-secret: 填写自己微信支付密码
@@ -119,6 +119,6 @@ security:
       - /im/callback/**
       - /pay/callback/**/m**
 
-query-daily-trai: https://www.yingyangfly.com/h5-training-daily/index.html
+query-daily-trai: https://yaorong.yaorongmedical.com/h5-training-daily/index.html
 
 review-task-space: 30