Skip to content

Commit 1ec154f

Browse files
committed
feat: SecureUtils 新增 decryptPasswordByRsaPrivateKey 方法统一处理密码解密
1 parent 93bf749 commit 1ec154f

File tree

6 files changed

+50
-47
lines changed

6 files changed

+50
-47
lines changed

continew-common/src/main/java/top/continew/admin/common/util/SecureUtils.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@
1717
package top.continew.admin.common.util;
1818

1919
import cn.hutool.core.codec.Base64;
20+
import cn.hutool.core.util.ReUtil;
2021
import cn.hutool.crypto.SecureUtil;
2122
import cn.hutool.crypto.asymmetric.KeyType;
2223
import top.continew.admin.common.config.RsaProperties;
24+
import top.continew.admin.common.constant.RegexConstants;
25+
import top.continew.starter.core.util.ExceptionUtils;
2326
import top.continew.starter.core.util.validation.ValidationUtils;
2427

2528
/**
@@ -78,4 +81,35 @@ public static String encryptByRsaPublicKey(String data, String publicKey) {
7881
public static String decryptByRsaPrivateKey(String data, String privateKey) {
7982
return new String(SecureUtil.rsa(privateKey, null).decrypt(Base64.decode(data), KeyType.PrivateKey));
8083
}
84+
85+
/**
86+
* 解密密码
87+
*
88+
* @param encryptedPasswordByRsaPublicKey 密码(已被 Rsa 公钥加密)
89+
* @param errorMsg 错误信息
90+
* @return 解密后的密码
91+
*/
92+
public static String decryptPasswordByRsaPrivateKey(String encryptedPasswordByRsaPublicKey, String errorMsg) {
93+
return decryptPasswordByRsaPrivateKey(encryptedPasswordByRsaPublicKey, errorMsg, false);
94+
}
95+
96+
/**
97+
* 解密密码
98+
*
99+
* @param encryptedPasswordByRsaPublicKey 密码(已被 Rsa 公钥加密)
100+
* @param errorMsg 错误信息
101+
* @param isVerifyPattern 是否验证密码格式
102+
* @return 解密后的密码
103+
*/
104+
public static String decryptPasswordByRsaPrivateKey(String encryptedPasswordByRsaPublicKey,
105+
String errorMsg,
106+
boolean isVerifyPattern) {
107+
String rawPassword = ExceptionUtils.exToNull(() -> decryptByRsaPrivateKey(encryptedPasswordByRsaPublicKey));
108+
ValidationUtils.throwIfBlank(rawPassword, errorMsg);
109+
if (isVerifyPattern) {
110+
ValidationUtils.throwIf(!ReUtil
111+
.isMatch(RegexConstants.PASSWORD, rawPassword), "密码长度为 8-32 个字符,支持大小写字母、数字、特殊字符,至少包含字母和数字");
112+
}
113+
return rawPassword;
114+
}
81115
}

continew-plugin/continew-plugin-tenant/src/main/java/top/continew/admin/tenant/controller/TenantController.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@
3535
import top.continew.admin.tenant.model.resp.TenantDetailResp;
3636
import top.continew.admin.tenant.model.resp.TenantResp;
3737
import top.continew.admin.tenant.service.TenantService;
38-
import top.continew.starter.core.util.ExceptionUtils;
39-
import top.continew.starter.core.util.validation.ValidationUtils;
4038
import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
4139
import top.continew.starter.extension.crud.enums.Api;
4240
import top.continew.starter.extension.tenant.util.TenantUtils;
@@ -61,10 +59,8 @@ public class TenantController extends BaseController<TenantService, TenantResp,
6159
@PutMapping("/{id}/admin/pwd")
6260
public void updateAdminUserPwd(@Valid @RequestBody TenantAdminUserPwdUpdateReq req, @PathVariable Long id) {
6361
TenantDO tenant = baseService.getById(id);
64-
String encryptPassword = req.getPassword();
6562
TenantUtils.execute(id, () -> {
66-
String password = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(encryptPassword));
67-
ValidationUtils.throwIfNull(password, "新密码解密失败");
63+
String password = SecureUtils.decryptPasswordByRsaPrivateKey(req.getPassword(), "新密码解密失败");
6864
userApi.resetPassword(password, tenant.getAdminUser());
6965
});
7066
}

continew-system/src/main/java/top/continew/admin/auth/handler/AccountLoginHandler.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import top.continew.admin.system.model.entity.user.UserDO;
3737
import top.continew.admin.system.model.resp.ClientResp;
3838
import top.continew.starter.cache.redisson.util.RedisUtils;
39-
import top.continew.starter.core.util.ExceptionUtils;
4039
import top.continew.starter.core.util.validation.CheckUtils;
4140
import top.continew.starter.core.util.validation.ValidationUtils;
4241

@@ -58,12 +57,11 @@ public class AccountLoginHandler extends AbstractLoginHandler<AccountLoginReq> {
5857
@Override
5958
public LoginResp login(AccountLoginReq req, ClientResp client, HttpServletRequest request) {
6059
// 解密密码
61-
String rawPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getPassword()));
62-
ValidationUtils.throwIfBlank(rawPassword, "密码解密失败");
60+
String password = SecureUtils.decryptPasswordByRsaPrivateKey(req.getPassword(), "密码解密失败");
6361
// 验证用户名密码
6462
String username = req.getUsername();
6563
UserDO user = userService.getByUsername(username);
66-
boolean isError = ObjectUtil.isNull(user) || !passwordEncoder.matches(rawPassword, user.getPassword());
64+
boolean isError = ObjectUtil.isNull(user) || !passwordEncoder.matches(password, user.getPassword());
6765
// 检查账号锁定状态
6866
this.checkUserLocked(req.getUsername(), request, isError);
6967
ValidationUtils.throwIf(isError, "用户名或密码不正确");

continew-system/src/main/java/top/continew/admin/system/api/TenantDataApiForSystemImpl.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import cn.dev33.satoken.stp.StpUtil;
2020
import cn.hutool.core.collection.ListUtil;
21-
import cn.hutool.core.util.ReUtil;
2221
import com.baomidou.mybatisplus.core.conditions.Wrapper;
2322
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
2423
import lombok.RequiredArgsConstructor;
@@ -28,7 +27,6 @@
2827
import top.continew.admin.common.api.tenant.TenantApi;
2928
import top.continew.admin.common.api.tenant.TenantDataApi;
3029
import top.continew.admin.common.constant.GlobalConstants;
31-
import top.continew.admin.common.constant.RegexConstants;
3230
import top.continew.admin.common.enums.DataScopeEnum;
3331
import top.continew.admin.common.enums.DisEnableStatusEnum;
3432
import top.continew.admin.common.enums.GenderEnum;
@@ -47,8 +45,6 @@
4745
import top.continew.admin.system.service.RoleMenuService;
4846
import top.continew.admin.system.service.UserRoleService;
4947
import top.continew.starter.core.util.CollUtils;
50-
import top.continew.starter.core.util.ExceptionUtils;
51-
import top.continew.starter.core.util.validation.ValidationUtils;
5248
import top.continew.starter.extension.tenant.util.TenantUtils;
5349

5450
import java.time.LocalDateTime;
@@ -187,15 +183,12 @@ private Long initRoleData(TenantDTO tenant) {
187183
*/
188184
private Long initUserData(TenantDTO tenant, Long deptId) {
189185
// 解密密码
190-
String rawPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(tenant.getPassword()));
191-
ValidationUtils.throwIfNull(rawPassword, "密码解密失败");
192-
ValidationUtils.throwIf(!ReUtil
193-
.isMatch(RegexConstants.PASSWORD, rawPassword), "密码长度为 8-32 个字符,支持大小写字母、数字、特殊字符,至少包含字母和数字");
186+
String password = SecureUtils.decryptPasswordByRsaPrivateKey(tenant.getPassword(), "密码解密失败", true);
194187
// 初始化用户
195188
UserDO user = new UserDO();
196189
user.setUsername(tenant.getUsername());
197190
user.setNickname(RoleCodeEnum.TENANT_ADMIN.getDescription());
198-
user.setPassword(rawPassword);
191+
user.setPassword(password);
199192
user.setGender(GenderEnum.UNKNOWN);
200193
user.setDescription("系统初始用户");
201194
user.setStatus(DisEnableStatusEnum.ENABLE);

continew-system/src/main/java/top/continew/admin/system/controller/UserController.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package top.continew.admin.system.controller;
1818

1919
import cn.dev33.satoken.annotation.SaCheckPermission;
20-
import cn.hutool.core.util.ReUtil;
2120
import io.swagger.v3.oas.annotations.Operation;
2221
import io.swagger.v3.oas.annotations.Parameter;
2322
import io.swagger.v3.oas.annotations.enums.ParameterIn;
@@ -31,7 +30,6 @@
3130
import org.springframework.web.bind.annotation.*;
3231
import org.springframework.web.multipart.MultipartFile;
3332
import top.continew.admin.common.base.controller.BaseController;
34-
import top.continew.admin.common.constant.RegexConstants;
3533
import top.continew.admin.common.util.SecureUtils;
3634
import top.continew.admin.system.model.query.UserQuery;
3735
import top.continew.admin.system.model.req.user.UserImportReq;
@@ -43,7 +41,6 @@
4341
import top.continew.admin.system.model.resp.user.UserImportResp;
4442
import top.continew.admin.system.model.resp.user.UserResp;
4543
import top.continew.admin.system.service.UserService;
46-
import top.continew.starter.core.util.ExceptionUtils;
4744
import top.continew.starter.core.util.validation.ValidationUtils;
4845
import top.continew.starter.extension.crud.annotation.CrudRequestMapping;
4946
import top.continew.starter.extension.crud.enums.Api;
@@ -68,11 +65,8 @@ public class UserController extends BaseController<UserService, UserResp, UserDe
6865
@Override
6966
@Operation(summary = "新增数据", description = "新增数据")
7067
public IdResp<Long> create(@RequestBody @Valid UserReq req) {
71-
String rawPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getPassword()));
72-
ValidationUtils.throwIfNull(rawPassword, "密码解密失败");
73-
ValidationUtils.throwIf(!ReUtil
74-
.isMatch(RegexConstants.PASSWORD, rawPassword), "密码长度为 8-32 个字符,支持大小写字母、数字、特殊字符,至少包含字母和数字");
75-
req.setPassword(rawPassword);
68+
String password = SecureUtils.decryptPasswordByRsaPrivateKey(req.getPassword(), "密码解密失败", true);
69+
req.setPassword(password);
7670
return super.create(req);
7771
}
7872

@@ -103,11 +97,8 @@ public UserImportResp importUser(@RequestBody @Valid UserImportReq req) {
10397
@SaCheckPermission("system:user:resetPwd")
10498
@PatchMapping("/{id}/password")
10599
public void resetPassword(@RequestBody @Valid UserPasswordResetReq req, @PathVariable Long id) {
106-
String rawNewPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(req.getNewPassword()));
107-
ValidationUtils.throwIfNull(rawNewPassword, "新密码解密失败");
108-
ValidationUtils.throwIf(!ReUtil
109-
.isMatch(RegexConstants.PASSWORD, rawNewPassword), "密码长度为 8-32 个字符,支持大小写字母、数字、特殊字符,至少包含字母和数字");
110-
req.setNewPassword(rawNewPassword);
100+
String newPassword = SecureUtils.decryptPasswordByRsaPrivateKey(req.getNewPassword(), "新密码解密失败", true);
101+
req.setNewPassword(newPassword);
111102
baseService.resetPassword(req, id);
112103
}
113104

continew-system/src/main/java/top/continew/admin/system/controller/UserProfileController.java

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import top.continew.starter.cache.redisson.util.RedisUtils;
5050
import top.continew.starter.core.exception.BadRequestException;
5151
import top.continew.starter.core.util.CollUtils;
52-
import top.continew.starter.core.util.ExceptionUtils;
5352
import top.continew.starter.core.util.validation.ValidationUtils;
5453

5554
import java.io.IOException;
@@ -91,41 +90,33 @@ public void updateBasicInfo(@RequestBody @Valid UserBasicInfoUpdateReq req) {
9190
@Operation(summary = "修改密码", description = "修改用户登录密码")
9291
@PatchMapping("/password")
9392
public void updatePassword(@RequestBody @Valid UserPasswordUpdateReq updateReq) {
94-
String rawOldPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateReq
95-
.getOldPassword()));
96-
ValidationUtils.throwIfNull(rawOldPassword, DECRYPT_FAILED);
97-
String rawNewPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateReq
98-
.getNewPassword()));
99-
ValidationUtils.throwIfNull(rawNewPassword, "新密码解密失败");
100-
userService.updatePassword(rawOldPassword, rawNewPassword, UserContextHolder.getUserId());
93+
String oldPassword = SecureUtils.decryptPasswordByRsaPrivateKey(updateReq.getOldPassword(), DECRYPT_FAILED);
94+
String newPassword = SecureUtils.decryptPasswordByRsaPrivateKey(updateReq.getNewPassword(), "新密码解密失败");
95+
userService.updatePassword(oldPassword, newPassword, UserContextHolder.getUserId());
10196
}
10297

10398
@Operation(summary = "修改手机号", description = "修改手机号")
10499
@PatchMapping("/phone")
105100
public void updatePhone(@RequestBody @Valid UserPhoneUpdateReq updateReq) {
106-
String rawOldPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateReq
107-
.getOldPassword()));
108-
ValidationUtils.throwIfBlank(rawOldPassword, DECRYPT_FAILED);
101+
String oldPassword = SecureUtils.decryptPasswordByRsaPrivateKey(updateReq.getOldPassword(), DECRYPT_FAILED);
109102
String captchaKey = CacheConstants.CAPTCHA_KEY_PREFIX + updateReq.getPhone();
110103
String captcha = RedisUtils.get(captchaKey);
111104
ValidationUtils.throwIfBlank(captcha, CAPTCHA_EXPIRED);
112105
ValidationUtils.throwIfNotEqualIgnoreCase(updateReq.getCaptcha(), captcha, "验证码不正确");
113106
RedisUtils.delete(captchaKey);
114-
userService.updatePhone(updateReq.getPhone(), rawOldPassword, UserContextHolder.getUserId());
107+
userService.updatePhone(updateReq.getPhone(), oldPassword, UserContextHolder.getUserId());
115108
}
116109

117110
@Operation(summary = "修改邮箱", description = "修改用户邮箱")
118111
@PatchMapping("/email")
119112
public void updateEmail(@RequestBody @Valid UserEmailUpdateReq updateReq) {
120-
String rawOldPassword = ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(updateReq
121-
.getOldPassword()));
122-
ValidationUtils.throwIfBlank(rawOldPassword, DECRYPT_FAILED);
113+
String oldPassword = SecureUtils.decryptPasswordByRsaPrivateKey(updateReq.getOldPassword(), DECRYPT_FAILED);
123114
String captchaKey = CacheConstants.CAPTCHA_KEY_PREFIX + updateReq.getEmail();
124115
String captcha = RedisUtils.get(captchaKey);
125116
ValidationUtils.throwIfBlank(captcha, CAPTCHA_EXPIRED);
126117
ValidationUtils.throwIfNotEqualIgnoreCase(updateReq.getCaptcha(), captcha, "验证码不正确");
127118
RedisUtils.delete(captchaKey);
128-
userService.updateEmail(updateReq.getEmail(), rawOldPassword, UserContextHolder.getUserId());
119+
userService.updateEmail(updateReq.getEmail(), oldPassword, UserContextHolder.getUserId());
129120
}
130121

131122
@Operation(summary = "查询绑定的三方账号", description = "查询绑定的三方账号")

0 commit comments

Comments
 (0)