Parcourir la source

优化用户登录

SpringSunYY il y a 5 mois
Parent
commit
9f86d3946f

+ 4 - 4
ruoyi_common/domain/entity.py

@@ -75,9 +75,9 @@ class SysUser(AuditEntity):
     ]
     ]
 
 
     dept_id: Annotated[
     dept_id: Annotated[
-        int,
+        Optional[int],
         BeforeValidator(str_to_int),
         BeforeValidator(str_to_int),
-        Field(gt=0, default=None),
+        Field(default=None),
         VoField(query=True),
         VoField(query=True),
         ExcelField(name="部门编号", action="import")
         ExcelField(name="部门编号", action="import")
     ]
     ]
@@ -369,9 +369,9 @@ class SysDictData(AuditEntity):
 
 
 class SysDept(AuditEntity):
 class SysDept(AuditEntity):
     dept_id: Annotated[
     dept_id: Annotated[
-        int,
+        Optional[int],
         BeforeValidator(str_to_int),
         BeforeValidator(str_to_int),
-        Field(gt=0, default=None, vo=VoAccess(query=True))
+        Field(default=None, vo=VoAccess(query=True))
     ]
     ]
 
 
     parent_id: Annotated[
     parent_id: Annotated[

+ 27 - 1
ruoyi_common/utils/security_util.py

@@ -120,4 +120,30 @@ def login_user_is_admin() -> bool:
         user = get_login_user().user
         user = get_login_user().user
         return is_user_admin(user)
         return is_user_admin(user)
     except:
     except:
-        return is_admin(get_user_id())
+        return is_admin(get_user_id())
+
+
+def encrypt_password(password: str) -> str:
+    """
+    使用 bcrypt 加密密码
+    """
+    if not password:
+        raise UtilException("密码不能为空", HttpStatus.BAD_REQUEST)
+    hashed = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
+    return hashed.decode("utf-8")
+
+
+def matches_password(raw_password: str, encoded_password: str) -> bool:
+    """
+    判断原始密码与加密密码是否匹配
+    """
+    if not raw_password or not encoded_password:
+        return False
+    try:
+        return bcrypt.checkpw(
+            raw_password.encode("utf-8"),
+            encoded_password.encode("utf-8"),
+        )
+    except ValueError:
+        # encoded_password 不是合法的 bcrypt 字符串
+        return False

+ 18 - 4
ruoyi_system/mapper/sys_user.py

@@ -227,13 +227,26 @@ class SysUserMapper:
 
 
         column = getattr(SysUserPo, key)
         column = getattr(SysUserPo, key)
         stmt = select(*user_columns, *dept_columns, *role_columns).distinct() \
         stmt = select(*user_columns, *dept_columns, *role_columns).distinct() \
-            .join(SysDeptPo, SysUserPo.dept_id == SysDeptPo.dept_id) \
-            .join(SysUserRolePo, SysUserPo.user_id == SysUserRolePo.user_id) \
-            .join(SysRolePo, SysUserRolePo.role_id == SysRolePo.role_id) \
+            .join(
+                SysDeptPo,
+                SysUserPo.dept_id == SysDeptPo.dept_id,
+                isouter=True
+            ) \
+            .join(
+                SysUserRolePo,
+                SysUserPo.user_id == SysUserRolePo.user_id,
+                isouter=True
+            ) \
+            .join(
+                SysRolePo,
+                SysUserRolePo.role_id == SysRolePo.role_id,
+                isouter=True
+            ) \
             .where(column == value)
             .where(column == value)
         rows = db.session.execute(stmt).all()
         rows = db.session.execute(stmt).all()
 
 
         eo_tmp = {}
         eo_tmp = {}
+        role_pk_label = role_columns[0].key if role_columns else None
         for row in rows:
         for row in rows:
             if key in eo_tmp:
             if key in eo_tmp:
                 user = eo_tmp[key]
                 user = eo_tmp[key]
@@ -241,7 +254,8 @@ class SysUserMapper:
                 user = user_columns.cast(row, SysUser)
                 user = user_columns.cast(row, SysUser)
                 user.dept = dept_columns.cast(row, SysDept)
                 user.dept = dept_columns.cast(row, SysDept)
                 eo_tmp[key] = user
                 eo_tmp[key] = user
-            user.roles.append(role_columns.cast(row, SysRole))
+            if role_pk_label and getattr(row, role_pk_label) is not None:
+                user.roles.append(role_columns.cast(row, SysRole))
 
 
         return eo_tmp[key] if rows else None
         return eo_tmp[key] if rows else None