diff --git a/ruoyi-fastapi-backend/module_admin/entity/vo/user_vo.py b/ruoyi-fastapi-backend/module_admin/entity/vo/user_vo.py index 9ef8867..0230882 100644 --- a/ruoyi-fastapi-backend/module_admin/entity/vo/user_vo.py +++ b/ruoyi-fastapi-backend/module_admin/entity/vo/user_vo.py @@ -127,6 +127,7 @@ class CurrentUserModel(BaseModel): roles: List = Field(description='角色信息') user: Union[UserInfoModel, None] = Field(description='用户信息') is_default_modify_pwd: bool = Field(default=False, description='是否初始密码修改提醒') + is_password_expired: bool = Field(default=False, description='密码是否过期提醒') class UserDetailModel(BaseModel): diff --git a/ruoyi-fastapi-backend/module_admin/service/login_service.py b/ruoyi-fastapi-backend/module_admin/service/login_service.py index e5a5f30..bcf38b4 100644 --- a/ruoyi-fastapi-backend/module_admin/service/login_service.py +++ b/ruoyi-fastapi-backend/module_admin/service/login_service.py @@ -245,6 +245,9 @@ class LoginService: is_default_modify_pwd = await cls.__init_password_is_modify( request, query_user.get('user_basic_info').pwd_update_date ) + is_password_expired = await cls.__password_is_expired( + request, query_user.get('user_basic_info').pwd_update_date + ) current_user = CurrentUserModel( permissions=permissions, @@ -257,6 +260,7 @@ class LoginService: role=CamelCaseUtil.transform_result(query_user.get('user_role_info')), ), isDefaultModifyPwd=is_default_modify_pwd, + isPasswordExpired=is_password_expired, ) return current_user else: @@ -277,6 +281,26 @@ class LoginService: ) return init_password_is_modify == '1' and pwd_update_date is None + @classmethod + async def __password_is_expired(cls, request: Request, pwd_update_date: datetime): + """ + 判断当前用户密码是否过期 + + :param request: Request对象 + :param pwd_update_date: 密码最后更新时间 + :return: 密码是否过期 + """ + password_validate_days = await request.app.state.redis.get( + f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.account.passwordValidateDays' + ) + if password_validate_days and int(password_validate_days) > 0: + if pwd_update_date is None: + return True + expire_date = pwd_update_date + timedelta(days=int(password_validate_days)) + if datetime.now() > expire_date: + return True + return False + @classmethod async def get_current_user_routers(cls, user_id: int, query_db: AsyncSession): """ diff --git a/ruoyi-fastapi-backend/sql/ruoyi-fastapi-pg.sql b/ruoyi-fastapi-backend/sql/ruoyi-fastapi-pg.sql index fbe559b..18446b0 100644 --- a/ruoyi-fastapi-backend/sql/ruoyi-fastapi-pg.sql +++ b/ruoyi-fastapi-backend/sql/ruoyi-fastapi-pg.sql @@ -707,6 +707,7 @@ insert into sys_config values(4, '账号自助-验证码开关', 'sys. insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', current_timestamp, '', null, '是否开启注册用户功能(true开启,false关闭)'); insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', current_timestamp, '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); insert into sys_config values(7, '用户管理-初始密码修改策略', 'sys.account.initPasswordModify', '1', 'Y', 'admin', current_timestamp, '', null, '0:初始密码修改策略关闭,没有任何提示,1:提醒用户,如果未修改初始密码,则在登录时就会提醒修改密码对话框'); +insert into sys_config values(8, '用户管理-账号密码更新周期', 'sys.account.passwordValidateDays', '0', 'Y', 'admin', current_timestamp, '', null, '密码更新周期(填写数字,数据初始化值为0不限制,若修改必须为大于0小于365的正整数),如果超过这个周期登录系统时,则在登录时就会提醒修改密码对话框'); -- ---------------------------- -- 14、系统访问记录 diff --git a/ruoyi-fastapi-backend/sql/ruoyi-fastapi.sql b/ruoyi-fastapi-backend/sql/ruoyi-fastapi.sql index 2795698..e489007 100644 --- a/ruoyi-fastapi-backend/sql/ruoyi-fastapi.sql +++ b/ruoyi-fastapi-backend/sql/ruoyi-fastapi.sql @@ -556,6 +556,7 @@ insert into sys_config values(4, '账号自助-验证码开关', 'sys. insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)'); insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)'); insert into sys_config values(7, '用户管理-初始密码修改策略', 'sys.account.initPasswordModify', '1', 'Y', 'admin', sysdate(), '', null, '0:初始密码修改策略关闭,没有任何提示,1:提醒用户,如果未修改初始密码,则在登录时就会提醒修改密码对话框'); +insert into sys_config values(8, '用户管理-账号密码更新周期', 'sys.account.passwordValidateDays', '0', 'Y', 'admin', sysdate(), '', null, '密码更新周期(填写数字,数据初始化值为0不限制,若修改必须为大于0小于365的正整数),如果超过这个周期登录系统时,则在登录时就会提醒修改密码对话框'); -- ---------------------------- diff --git a/ruoyi-fastapi-frontend/src/store/modules/user.js b/ruoyi-fastapi-frontend/src/store/modules/user.js index 36b562f..bba5dd6 100644 --- a/ruoyi-fastapi-frontend/src/store/modules/user.js +++ b/ruoyi-fastapi-frontend/src/store/modules/user.js @@ -59,6 +59,12 @@ const useUserStore = defineStore( router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) }).catch(() => {}) } + /* 过期密码提示 */ + if(!res.isDefaultModifyPwd && res.isPasswordExpired) { + ElMessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } }) + }).catch(() => {}) + } resolve(res) }).catch(error => { reject(error)