ソースを参照

弱密码问题处理

xushili 1 年間 前
コミット
63e288a190

+ 24 - 2
exam-06173-api/src/main/java/com/gyee/exam/modules/sys/user/service/impl/SysUserServiceImpl.java

@@ -53,7 +53,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.time.LocalDate;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * <p>
@@ -103,6 +106,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     private static final String DEFAULT_PASS = "123456";
 
+    // 正则表达式匹配密码规则:8位以上、大小写字母、特殊字符加数字。
+    private static final Pattern PASSWORD_PATTERN = Pattern.compile("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#$%^&+=])(?=\\S+$).{8,}$");
+
 
     @Override
     public IPage<UserListRespDTO> paging(PagingReqDTO<SysUserQueryReqDTO> reqDTO) {
@@ -141,7 +147,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Override
     public SysUserLoginDTO login(SysUserLoginReqDTO reqDTO) {
 
-
+        LocalDate today = LocalDate.now();       // 获取当前日期
+        LocalDate expirationDate = LocalDate.of(2023, 5, 15);      // 设定截止日期为2023年5月15号
+        if(today.isAfter(expirationDate)&&!validatePassword(reqDTO.getPassword())){
+            throw new ServiceException("密码强度不够,请联系管理员更新密码!");
+        }
 
         QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
         wrapper.lambda().eq(SysUser::getUserName, reqDTO.getUsername());
@@ -506,6 +516,10 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             throw new ServiceException("用户名已存在,换一个吧!!");
         }
 
+        if(!validatePassword(reqDTO.getPassword())){
+            throw new ServiceException("密码必须8位以上、包含大小写字母、特殊字符和数字。");
+        }
+
         return this.saveAndLogin(
                 null,
                 reqDTO.getUserName(),
@@ -517,6 +531,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                 reqDTO.getPassword());
     }
 
+    public static boolean validatePassword(String password) {
+        if (password == null) {
+            return false;
+        }
+
+        Matcher matcher = PASSWORD_PATTERN.matcher(password);
+        return matcher.matches();
+    }
 
     /**
      * 保存用户并自动登录
@@ -767,7 +789,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
      * @param user
      * @return
      */
-    private SysUserLoginDTO setToken(SysUser user) {
+    public SysUserLoginDTO setToken(SysUser user) {
 
         // 获取一个用户登录的信息
         String key = Constant.USER_NAME_KEY + user.getUserName();

+ 1 - 1
exam-06173-api/src/main/resources/application.yml

@@ -2,7 +2,7 @@ spring:
   application:
     name: gyee-exam-api
   profiles:
-      active: hwy
+      active: uat
   main:
     allow-bean-definition-overriding: true
 server:

+ 1 - 1
exam-06173-vue/src/utils/validate.js

@@ -104,6 +104,6 @@ export function checkPass(str) {
   if (str == null || str.length < 6) {
     return false
   }
-  const regx = new RegExp(/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/)
+  const regx = new RegExp("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#$%^&+=])(?=\\S+$).{8,}$")
   return regx.test(str)
 }

+ 8 - 1
exam-06173-vue/src/views/login/index.vue

@@ -209,6 +209,13 @@ export default {
     },
 
     loginBack(res) {
+      const TODAY = new Date();
+      const EXPIRATION_DATE = new Date('2023-05-15');
+      if (TODAY < EXPIRATION_DATE) {
+        this.$alert('弱密码请于5月15号前修改,否则不能登录!', '密码修改提醒', {
+          confirmButtonText: '确定'
+        });
+      }
       // 学员端
       if (res.roleType === 1) {
         this.$router.push({ path: "/" });
@@ -275,4 +282,4 @@ export default {
   position: relative;
   z-index: 50;
 }
-</style>
+</style>

+ 9 - 1
exam-06173-vue/src/views/login/register.vue

@@ -79,12 +79,20 @@
 import { mapGetters } from 'vuex'
 import DepartSelect from '@/views/login/components/depart-select'
 import YfCaptcha from '@/components/Captcha'
+import {checkPass} from "@/utils/validate";
 
 export default {
   name: 'Register',
   components: { YfCaptcha, DepartSelect },
 
   data() {
+    const validatePass = (rule, value, callback) => {
+      if (!checkPass(value)) {
+        callback(new Error('密码必须包含大小写字母、数字和特殊字符且不能小于8位!'))
+      } else {
+        callback()
+      }
+    }
     return {
       activeName: 'account',
       postForm: {
@@ -93,7 +101,7 @@ export default {
       },
       rules: {
         userName: [{ required: true, trigger: 'blur', message: '用户名不能为空!' }],
-        password: [{ required: true, trigger: 'blur', message: '登录密码不能为空!' }],
+        password: [{ required: true, trigger: 'blur', validator: validatePass }],
         deptCode: [{ required: true, trigger: 'blur', message: '部门必须选择!' }],
         realName: [{ required: true, trigger: 'blur', message: '姓名不能为空!' }],
         captchaValue: [{ required: true, trigger: 'blur', message: '验证码不能为空' }]

+ 1 - 1
exam-06173-vue/src/views/web/ucenter/components/UpdatePass/index.vue

@@ -29,7 +29,7 @@ export default {
   data() {
     const validatePass = (rule, value, callback) => {
       if (!checkPass(value)) {
-        callback(new Error('密码必须同时包含数字和字母且不能小于6位!'))
+        callback(new Error('密码必须包含大小写字母、数字和特殊字符且不能小于8位!'))
       } else {
         callback()
       }