Explorar el Código

feat(auth): 密码只校验字母/数字,去掉长度限制

- 后端 assertPasswordLength 改为 assertPasswordFormat([A-Za-z0-9]+),新建用户/修改密码/重置密码三处共用,任意长度均可用
- 前端新建用户、重置密码、修改密码弹窗同步改为字母数字校验,占位符改为「字母或数字」
cc hace 1 día
padre
commit
b8583851dc

+ 7 - 4
ai-electron/frontend/src/core/layouts/default/header/components/user-dropdown/index.vue

@@ -30,7 +30,7 @@
         <InputPassword v-model:value="pwdForm.oldPwd" placeholder="请输入原密码" autocomplete="current-password" />
       </FormItem>
       <FormItem label="新密码" required>
-        <InputPassword v-model:value="pwdForm.newPwd" placeholder="至少 6 位" autocomplete="new-password" />
+        <InputPassword v-model:value="pwdForm.newPwd" placeholder="字母或数字" autocomplete="new-password" />
       </FormItem>
       <FormItem label="确认新密码" required>
         <InputPassword v-model:value="pwdForm.confirmPwd" placeholder="再次输入新密码" autocomplete="new-password" />
@@ -53,6 +53,9 @@
   import { useUserStore } from '@/core/store/modules/case';
   import UserManageModal from '@/plat/views/user/UserManageModal.vue';
 
+  /** 密码规则:仅字母 / 数字(可混合),不限长度 */
+  const PASSWORD_PATTERN = /^[A-Za-z0-9]+$/;
+
   export default defineComponent({
     name: 'UserDropdown',
     components: {
@@ -115,7 +118,7 @@
             content: '确认退出登录?将退出当前案件并注销登录,需要重新输入账号密码。',
             okText: '退出登录',
             okType: 'primary',
-                    okButtonProps: { danger: true },
+            okButtonProps: { danger: true },
             cancelText: '取消',
             onOk: async () => {
               await doLogout();
@@ -129,8 +132,8 @@
           createMessage.warning('请填写原密码和新密码');
           return;
         }
-        if (pwdForm.newPwd.length < 6) {
-          createMessage.warning('新密码长度不能少于 6 位');
+        if (!PASSWORD_PATTERN.test(pwdForm.newPwd)) {
+          createMessage.warning('新密码只能由字母或数字组成');
           return;
         }
         if (pwdForm.newPwd !== pwdForm.confirmPwd) {

+ 9 - 6
ai-electron/frontend/src/plat/views/user/UserManageModal.vue

@@ -57,7 +57,7 @@
         <Input v-model:value="form.username" :disabled="!!form.id" placeholder="登录名,创建后不可修改" />
       </FormItem>
       <FormItem v-if="!form.id" label="初始密码" required>
-        <InputPassword v-model:value="form.password" placeholder="至少 6 位" autocomplete="new-password" />
+        <InputPassword v-model:value="form.password" placeholder="字母或数字" autocomplete="new-password" />
       </FormItem>
       <FormItem label="显示名">
         <Input v-model:value="form.displayName" placeholder="不填则与用户名一致" />
@@ -86,7 +86,7 @@
     @ok="handleResetPwd"
   >
     <p class="user-manage__hint">为「{{ pwdTarget?.username }}」设置新密码,重置后该用户会被强制下线。</p>
-    <InputPassword v-model:value="newPassword" placeholder="至少 6 位" autocomplete="new-password" />
+    <InputPassword v-model:value="newPassword" placeholder="字母或数字" autocomplete="new-password" />
   </Modal>
 </template>
 
@@ -117,6 +117,9 @@
     type UserInfo,
   } from '@/core/api/auth/authApi';
 
+  /** 密码规则:仅字母 / 数字(可混合),不限长度 */
+  const PASSWORD_PATTERN = /^[A-Za-z0-9]+$/;
+
   export default defineComponent({
     name: 'UserManageModal',
     components: {
@@ -229,8 +232,8 @@
           createMessage.warning('请填写用户名');
           return;
         }
-        if (!form.id && (!form.password || form.password.length < 6)) {
-          createMessage.warning('初始密码不能少于 6 位');
+        if (!form.id && (!form.password || !PASSWORD_PATTERN.test(form.password))) {
+          createMessage.warning('初始密码只能由字母或数字组成');
           return;
         }
         submitting.value = true;
@@ -266,8 +269,8 @@
       }
 
       async function handleResetPwd() {
-        if (!pwdTarget.value || !newPassword.value || newPassword.value.length < 6) {
-          createMessage.warning('新密码不能少于 6 位');
+        if (!pwdTarget.value || !newPassword.value || !PASSWORD_PATTERN.test(newPassword.value)) {
+          createMessage.warning('新密码只能由字母或数字组成');
           return;
         }
         submitting.value = true;

+ 15 - 6
ai-server/src/main/java/com/zsjz/ai/module/plat/service/SysUserService.java

@@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.regex.Pattern;
 
 /**
  * 用户服务:认证 + 用户管理。
@@ -45,6 +46,9 @@ public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> {
     private static final Integer FLAG_ON = 1;
     private static final Integer FLAG_OFF = 0;
 
+    /** 密码只允许字母、数字(可混合),不限长度 */
+    private static final Pattern PASSWORD_PATTERN = Pattern.compile("[A-Za-z0-9]+");
+
     private final PasswordEncoder passwordEncoder;
 
     private final CaseInfoMapper caseInfoMapper;
@@ -147,7 +151,7 @@ public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> {
         if (!passwordEncoder.matches(dto.getOldPwd(), user.getPwdHash())) {
             throw badRequest("原密码错误");
         }
-        assertPasswordLength(dto.getNewPwd());
+        assertPasswordFormat(dto.getNewPwd());
         SysUser update = new SysUser();
         update.setId(user.getId());
         update.setPwdHash(passwordEncoder.encode(dto.getNewPwd()));
@@ -201,7 +205,7 @@ public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> {
         if (StrUtil.isBlank(dto.getPassword())) {
             throw badRequest("密码不能为空");
         }
-        assertPasswordLength(dto.getPassword());
+        assertPasswordFormat(dto.getPassword());
         if (findByUsername(username) != null) {
             throw badRequest("登录名已存在");
         }
@@ -258,7 +262,7 @@ public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> {
         if (StrUtil.isBlank(dto.getNewPassword())) {
             throw badRequest("新密码不能为空");
         }
-        assertPasswordLength(dto.getNewPassword());
+        assertPasswordFormat(dto.getNewPassword());
         SysUser target = getById(dto.getId());
         if (target == null) {
             throw badRequest("用户不存在");
@@ -389,9 +393,14 @@ public class SysUserService extends ServiceImpl<SysUserMapper, SysUser> {
         }
     }
 
-    private void assertPasswordLength(String password) {
-        if (password.length() < 6) {
-            throw badRequest("密码长度不能少于 6 位");
+    /**
+     * 密码格式校验:只要求「字母 / 数字 / 字母数字组合」,不限长度。
+     *
+     * <p>不再限制最短位数 —— 现场习惯用简短口令,长度由管理员自行把握。
+     */
+    private void assertPasswordFormat(String password) {
+        if (StrUtil.isBlank(password) || !PASSWORD_PATTERN.matcher(password).matches()) {
+            throw badRequest("密码只能由字母或数字组成");
         }
     }