From b2ccec912693237c7039e8fabec322e4ce6dad0c Mon Sep 17 00:00:00 2001 From: kils Date: Fri, 14 Jun 2024 10:29:22 +0800 Subject: [PATCH 1/2] fix: remove last commit non-breaking space --- .../continew/admin/system/model/entity/FileDO.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/model/entity/FileDO.java b/continew-admin-system/src/main/java/top/continew/admin/system/model/entity/FileDO.java index a69a47bc..270b7e86 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/model/entity/FileDO.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/model/entity/FileDO.java @@ -74,7 +74,7 @@ public class FileDO extends BaseDO { /** * 缩略图URL */ - private String thumbnailUrl;  + private String thumbnailUrl; /** * 存储 ID @@ -91,16 +91,16 @@ public class FileDO extends BaseDO { FileInfo fileInfo = new FileInfo(); fileInfo.setOriginalFilename(StrUtils .blankToDefault(this.extension, this.name, ex -> this.name + StringConstants.DOT + ex)); - fileInfo.setSize(this.size);  + fileInfo.setSize(this.size); fileInfo.setUrl(this.url); fileInfo.setExt(this.extension); fileInfo.setBasePath(StringConstants.EMPTY); fileInfo.setPath(StringConstants.EMPTY); - fileInfo.setFilename(URLUtils.isHttpUrl(this.url)  - ? StrUtil.subAfter(this.url, StringConstants.SLASH, true)  + fileInfo.setFilename(URLUtils.isHttpUrl(this.url) + ? StrUtil.subAfter(this.url, StringConstants.SLASH, true) : this.url); - fileInfo.setThFilename(this.thumbnailUrl);   - fileInfo.setPlatform(storageCode);  + fileInfo.setThFilename(this.thumbnailUrl); + fileInfo.setPlatform(storageCode); return fileInfo; } } From 3fbe688f174c22bcf0dd948318299cf3d43e6079 Mon Sep 17 00:00:00 2001 From: kils Date: Fri, 14 Jun 2024 14:55:50 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E7=A6=81=E6=AD=A2=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E8=BF=87=E6=9C=9F=E7=94=A8=E6=88=B7=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/common/model/dto/LoginUser.java | 10 ++++ .../admin/common/util/helper/LoginHelper.java | 46 +++++++++++++++++++ .../auth/service/impl/LoginServiceImpl.java | 3 ++ .../admin/system/service/UserService.java | 9 ---- .../system/service/impl/UserServiceImpl.java | 17 ++----- .../admin/webapi/auth/AuthController.java | 6 +-- .../webapi/system/UserCenterController.java | 2 +- 7 files changed, 66 insertions(+), 27 deletions(-) diff --git a/continew-admin-common/src/main/java/top/continew/admin/common/model/dto/LoginUser.java b/continew-admin-common/src/main/java/top/continew/admin/common/model/dto/LoginUser.java index ab6ada69..f4df5238 100644 --- a/continew-admin-common/src/main/java/top/continew/admin/common/model/dto/LoginUser.java +++ b/continew-admin-common/src/main/java/top/continew/admin/common/model/dto/LoginUser.java @@ -97,6 +97,16 @@ public class LoginUser implements Serializable { */ private LocalDateTime loginTime; + /** + * 最后一次修改密码时间 + */ + private LocalDateTime pwdResetTime; + + /** + * 登录时系统设置的密码过期天数 + */ + private Integer passwordExpirationDays; + /** * 是否为管理员 * diff --git a/continew-admin-common/src/main/java/top/continew/admin/common/util/helper/LoginHelper.java b/continew-admin-common/src/main/java/top/continew/admin/common/util/helper/LoginHelper.java index 696781fd..cb674802 100644 --- a/continew-admin-common/src/main/java/top/continew/admin/common/util/helper/LoginHelper.java +++ b/continew-admin-common/src/main/java/top/continew/admin/common/util/helper/LoginHelper.java @@ -25,9 +25,11 @@ import cn.hutool.extra.servlet.JakartaServletUtil; import cn.hutool.extra.spring.SpringUtil; import jakarta.servlet.http.HttpServletRequest; import top.continew.admin.common.constant.CacheConstants; +import top.continew.admin.common.constant.SysConstants; import top.continew.admin.common.model.dto.LoginUser; import top.continew.starter.core.util.ExceptionUtils; import top.continew.starter.core.util.IpUtils; +import top.continew.starter.core.util.validate.CheckUtils; import top.continew.starter.extension.crud.service.CommonUserService; import top.continew.starter.web.util.ServletUtils; @@ -75,6 +77,16 @@ public class LoginHelper { * @throws NotLoginException 未登录异常 */ public static LoginUser getLoginUser() throws NotLoginException { + return getLoginUser(true); + } + + /** + * 登录用户信息 + * + * @param checkPasswordExpired 是否校验密码过期 + * @throws NotLoginException 未登录异常 + */ + public static LoginUser getLoginUser(boolean checkPasswordExpired) throws NotLoginException { StpUtil.checkLogin(); LoginUser loginUser = (LoginUser)SaHolder.getStorage().get(CacheConstants.LOGIN_USER_KEY); if (null != loginUser) { @@ -83,9 +95,33 @@ public class LoginHelper { SaSession tokenSession = StpUtil.getTokenSession(); loginUser = (LoginUser)tokenSession.get(CacheConstants.LOGIN_USER_KEY); SaHolder.getStorage().set(CacheConstants.LOGIN_USER_KEY, loginUser); + CheckUtils.throwIf(checkPasswordExpired && isPasswordExpired(loginUser), "密码已过期,请立即修改。"); return loginUser; } + /** + * 密码是否已过期 + * + * @param loginUser 登录用户 + * @return 是否过期 + */ + public static boolean isPasswordExpired(LoginUser loginUser) { + if (loginUser == null) { + loginUser = getLoginUser(); + } + LocalDateTime pwdResetTime = loginUser.getPwdResetTime(); + Integer passwordExpirationDays = loginUser.getPasswordExpirationDays(); + // 永久有效 + if (passwordExpirationDays == null || passwordExpirationDays <= SysConstants.NO) { + return false; + } + // 初始密码也提示修改 + if (pwdResetTime == null) { + return true; + } + return pwdResetTime.plusDays(passwordExpirationDays).isBefore(LocalDateTime.now()); + } + /** * 根据 Token 获取登录用户信息 * @@ -109,6 +145,16 @@ public class LoginHelper { return getLoginUser().getId(); } + /** + * 获取登录用户 ID + * + * @param checkPasswordExpired 是否校验密码过期 + * @return 登录用户 ID + */ + public static Long getUserId(boolean checkPasswordExpired) { + return getLoginUser(checkPasswordExpired).getId(); + } + /** * 获取登录用户名 * diff --git a/continew-admin-system/src/main/java/top/continew/admin/auth/service/impl/LoginServiceImpl.java b/continew-admin-system/src/main/java/top/continew/admin/auth/service/impl/LoginServiceImpl.java index 6b46495c..9f9ad618 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/auth/service/impl/LoginServiceImpl.java +++ b/continew-admin-system/src/main/java/top/continew/admin/auth/service/impl/LoginServiceImpl.java @@ -61,6 +61,8 @@ import java.time.Duration; import java.time.LocalDateTime; import java.util.*; +import static top.continew.admin.system.enums.PasswordPolicyEnum.PASSWORD_EXPIRATION_DAYS; + /** * 登录业务实现 * @@ -199,6 +201,7 @@ public class LoginServiceImpl implements LoginService { loginUser.setPermissions(permissionService.listPermissionByUserId(userId)); loginUser.setRoleCodes(permissionService.listRoleCodeByUserId(userId)); loginUser.setRoles(roleService.listByUserId(userId)); + loginUser.setPasswordExpirationDays(optionService.getValueByCode2Int(PASSWORD_EXPIRATION_DAYS.name())); return LoginHelper.login(loginUser); } diff --git a/continew-admin-system/src/main/java/top/continew/admin/system/service/UserService.java b/continew-admin-system/src/main/java/top/continew/admin/system/service/UserService.java index 5836b473..663e9510 100644 --- a/continew-admin-system/src/main/java/top/continew/admin/system/service/UserService.java +++ b/continew-admin-system/src/main/java/top/continew/admin/system/service/UserService.java @@ -29,7 +29,6 @@ import top.continew.starter.data.mybatis.plus.service.IService; import top.continew.starter.extension.crud.service.BaseService; import java.io.IOException; -import java.time.LocalDateTime; import java.util.List; /** @@ -90,14 +89,6 @@ public interface UserService extends BaseService getUserInfo() { - LoginUser loginUser = LoginHelper.getLoginUser(); + LoginUser loginUser = LoginHelper.getLoginUser(false); UserDetailResp userDetailResp = userService.get(loginUser.getId()); UserInfoResp userInfoResp = BeanUtil.copyProperties(userDetailResp, UserInfoResp.class); userInfoResp.setPermissions(loginUser.getPermissions()); userInfoResp.setRoles(loginUser.getRoleCodes()); - userInfoResp.setPwdExpired(userService.isPasswordExpired(userDetailResp.getPwdResetTime())); + userInfoResp.setPwdExpired(LoginHelper.isPasswordExpired(loginUser)); return R.ok(userInfoResp); } @@ -136,6 +136,6 @@ public class AuthController { @Operation(summary = "获取路由信息", description = "获取登录用户的路由信息") @GetMapping("/route") public R> listRoute() { - return R.ok(loginService.buildRouteTree(LoginHelper.getUserId())); + return R.ok(loginService.buildRouteTree(LoginHelper.getUserId(false))); } } \ No newline at end of file diff --git a/continew-admin-webapi/src/main/java/top/continew/admin/webapi/system/UserCenterController.java b/continew-admin-webapi/src/main/java/top/continew/admin/webapi/system/UserCenterController.java index 6a8bd8ca..f9d80fdc 100644 --- a/continew-admin-webapi/src/main/java/top/continew/admin/webapi/system/UserCenterController.java +++ b/continew-admin-webapi/src/main/java/top/continew/admin/webapi/system/UserCenterController.java @@ -94,7 +94,7 @@ public class UserCenterController { String rawNewPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateReq .getNewPassword())); ValidationUtils.throwIfNull(rawNewPassword, "新密码解密失败"); - userService.updatePassword(rawOldPassword, rawNewPassword, LoginHelper.getUserId()); + userService.updatePassword(rawOldPassword, rawNewPassword, LoginHelper.getUserId(false)); return R.ok("修改成功,请牢记你的新密码"); }