diff --git a/db/2pigxx.sql b/db/2pigxx.sql index 4bdc752f3..7bea7567c 100644 --- a/db/2pigxx.sql +++ b/db/2pigxx.sql @@ -1236,6 +1236,8 @@ CREATE TABLE `sys_user` ( `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `lock_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '锁定标记,0未锁定,9已锁定', + `password_expire_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '密码是否过期,0未过期,9已过期', + `password_modify_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记,0未删除,1已删除', `wx_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '微信登录openId', `mini_openid` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '小程序openId', @@ -1255,7 +1257,7 @@ CREATE TABLE `sys_user` ( -- Records of sys_user -- ---------------------------- BEGIN; -INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$c/Ae0pRjJtMZg3BnvVpO.eIK6WYWVbKTzqgdy3afR7w.vd.xi3Mgy', '', '13054729089', '/admin/sys-file/local/2a14ae08150e483c93e12ac8934173e2.png', '管理员666777', '管理员', 'sw@mail.pigxl.vip', 4, ' ', 'admin', '2018-04-20 07:15:18', '2023-04-03 14:00:06', '0', '0', NULL, 'oBxPy5E-v82xWGsfzZVzkD3wEX64', NULL, 'log4j', NULL, NULL,NULL,1); +INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$c/Ae0pRjJtMZg3BnvVpO.eIK6WYWVbKTzqgdy3afR7w.vd.xi3Mgy', '', '13054729089', '/admin/sys-file/local/2a14ae08150e483c93e12ac8934173e2.png', '管理员666777', '管理员', 'sw@mail.pigxl.vip', 4, ' ', 'admin', '2018-04-20 07:15:18', '2023-04-03 14:00:06', '0', '0', NULL, '0', NULL, 'oBxPy5E-v82xWGsfzZVzkD3wEX64', NULL, 'log4j', NULL, NULL,NULL,1); COMMIT; -- ---------------------------- diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index 53f3580c3..1e7819868 100644 --- a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -264,6 +264,12 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider result) { - // @formatter:off + /** + * 构建userdetails + * + * @param result 用户信息 + * @return UserDetails + * @throws UsernameNotFoundException + */ + default UserDetails getUserDetails(R result) { + // @formatter:off return RetOps.of(result) .getData() .map(this::convertUserDetails) .orElseThrow(() -> new UsernameNotFoundException("用户不存在")); // @formatter:on - } + } - /** - * UserInfo 转 UserDetails - * @param info - * @return 返回UserDetails对象 - */ - default UserDetails convertUserDetails(UserInfo info) { - Set dbAuthsSet = new HashSet<>(); - if (ArrayUtil.isNotEmpty(info.getRoles())) { - // 获取角色 - Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId)); - // 获取资源 - dbAuthsSet.addAll(Arrays.asList(info.getPermissions())); + /** + * UserInfo 转 UserDetails + * + * @param info + * @return 返回UserDetails对象 + */ + default UserDetails convertUserDetails(UserInfo info) { + Set dbAuthsSet = new HashSet<>(); + if (ArrayUtil.isNotEmpty(info.getRoles())) { + // 获取角色 + Arrays.stream(info.getRoles()).forEach(roleId -> dbAuthsSet.add(SecurityConstants.ROLE + roleId)); + // 获取资源 + dbAuthsSet.addAll(Arrays.asList(info.getPermissions())); - } - Collection authorities = AuthorityUtils - .createAuthorityList(dbAuthsSet.toArray(new String[0])); - SysUser user = info.getSysUser(); - // 构造security用户 + } + Collection authorities = AuthorityUtils + .createAuthorityList(dbAuthsSet.toArray(new String[0])); + SysUser user = info.getSysUser(); - return new PigxUser(user.getUserId(), user.getUsername(), user.getDeptId(), user.getPhone(), user.getAvatar(), - user.getNickname(), user.getName(), user.getEmail(), user.getTenantId(), - SecurityConstants.BCRYPT + user.getPassword(), true, true, UserTypeEnum.TOB.getStatus(), true, - !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); - } + // 构造security用户 + return new PigxUser(user.getUserId(), user.getUsername(), user.getDeptId(), user.getPhone(), user.getAvatar(), + user.getNickname(), user.getName(), user.getEmail(), user.getTenantId(), + SecurityConstants.BCRYPT + user.getPassword() + , true, true, UserTypeEnum.TOB.getStatus() + , !CommonConstants.STATUS_LOCK.equals(user.getPasswordExpireFlag()) // 密码过期判断 + , !CommonConstants.STATUS_LOCK.equals(user.getLockFlag()), authorities); + } - /** - * 通过用户实体查询 - * @param pigxUser user - * @return - */ - default UserDetails loadUserByUser(PigxUser pigxUser) { - return this.loadUserByUsername(pigxUser.getUsername()); - } + /** + * 通过用户实体查询 + * + * @param pigxUser user + * @return + */ + default UserDetails loadUserByUser(PigxUser pigxUser) { + return this.loadUserByUsername(pigxUser.getUsername()); + } } diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/SecurityUtils.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/SecurityUtils.java index 338e2435d..82ebceb89 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/SecurityUtils.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/util/SecurityUtils.java @@ -38,62 +38,65 @@ import java.util.List; @UtilityClass public class SecurityUtils { - /** - * 获取Authentication - */ - public Authentication getAuthentication() { - return SecurityContextHolder.getContext().getAuthentication(); - } + /** + * 获取Authentication + */ + public Authentication getAuthentication() { + return SecurityContextHolder.getContext().getAuthentication(); + } - /** - * 获取Authentication Token - * @return - */ - public String getToken(){ - Authentication authentication = SecurityUtils.getAuthentication(); - if (authentication instanceof BearerTokenAuthentication bearerTokenAuthentication) { - return bearerTokenAuthentication.getToken().getTokenValue(); - } - return null; - } + /** + * 获取Authentication Token + * + * @return + */ + public String getToken() { + Authentication authentication = SecurityUtils.getAuthentication(); + if (authentication instanceof BearerTokenAuthentication) { + return ((BearerTokenAuthentication) authentication).getToken().getTokenValue(); + } + return null; + } - /** - * 获取用户 - * @param authentication - * @return PigxUser - *

- */ - public PigxUser getUser(Authentication authentication) { - Object principal = authentication.getPrincipal(); - if (principal instanceof PigxUser) { - return (PigxUser) principal; - } - return null; - } + /** + * 获取用户 + * + * @param authentication + * @return PigxUser + *

+ */ + public PigxUser getUser(Authentication authentication) { + Object principal = authentication.getPrincipal(); + if (principal instanceof PigxUser) { + return (PigxUser) principal; + } + return null; + } - /** - * 获取用户 - */ - public PigxUser getUser() { - Authentication authentication = getAuthentication(); - return getUser(authentication); - } + /** + * 获取用户 + */ + public PigxUser getUser() { + Authentication authentication = getAuthentication(); + return getUser(authentication); + } - /** - * 获取用户角色信息 - * @return 角色集合 - */ - public List getRoleIds() { - Authentication authentication = getAuthentication(); - Collection authorities = authentication.getAuthorities(); + /** + * 获取用户角色信息 + * + * @return 角色集合 + */ + public List getRoleIds() { + Authentication authentication = getAuthentication(); + Collection authorities = authentication.getAuthorities(); - List roleIds = new ArrayList<>(); - authorities.stream().filter(granted -> StrUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) - .forEach(granted -> { - String id = StrUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); - roleIds.add(Long.parseLong(id)); - }); - return roleIds; - } + List roleIds = new ArrayList<>(); + authorities.stream().filter(granted -> StrUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) + .forEach(granted -> { + String id = StrUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); + roleIds.add(Long.parseLong(id)); + }); + return roleIds; + } } diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUser.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUser.java index 5c84dfb2a..ea6efaba8 100644 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUser.java +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysUser.java @@ -114,6 +114,20 @@ public class SysUser extends Model implements Serializable { @Schema(description = "锁定标记") private String lockFlag; + /** + * 密码过期标记 + */ + @Schema(description = "密码过期标记") + private String passwordExpireFlag; + + + /** + * 密码修改时间 + */ + @Schema(description = "密码修改时间") + private LocalDateTime passwordModifyTime; + + /** * 手机号 */ diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserVO.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserVO.java index b356bdb27..93af06408 100644 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserVO.java +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/UserVO.java @@ -112,6 +112,18 @@ public class UserVO implements Serializable { @Schema(description = "锁定标记,0:正常,9:已锁定") private String lockFlag; + /** + * 密码过期标记 + */ + @Schema(description = "密码过期标记") + private String passwordExpireFlag; + + /** + * 密码修改时间 + */ + @Schema(description = "密码修改时间") + private LocalDateTime passwordModifyTime; + /** * 手机号 */ diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RegisterController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RegisterController.java index c674ec178..5bfb69981 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RegisterController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/RegisterController.java @@ -18,24 +18,37 @@ import org.springframework.web.bind.annotation.RestController; *

* 客户端注册功能 register.user = false */ +@Inner(value = false) @RestController @RequestMapping("/register") @RequiredArgsConstructor -@ConditionalOnProperty(name = "register.user", matchIfMissing = true) public class RegisterController { - private final SysUserService userService; + private final SysUserService userService; - /** - * 注册用户 - * @param userDto 用户信息 - * @return success/false - */ - @Inner(value = false) - @SysLog("注册用户") - @PostMapping("/user") - public R registerUser(@RequestBody UserDTO userDto) { - return userService.registerUser(userDto); - } + /** + * 注册用户 + * + * @param userDto 用户信息 + * @return success/false + */ + @SysLog("注册用户") + @PostMapping("/user") + @ConditionalOnProperty(name = "register.user", matchIfMissing = true) + public R registerUser(@RequestBody UserDTO userDto) { + return userService.registerUser(userDto); + } + + /** + * 重置用户密码 + * + * @param userDto 用户信息 + * @return success/false + */ + @SysLog("重置用户密码") + @PostMapping("/password") + public R resetUserPassword(@RequestBody UserDTO userDto) { + return userService.resetUserPassword(userDto); + } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java index 9e3ecf2cf..bc29dd2ff 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java @@ -243,7 +243,7 @@ public class SysUserController { */ @PostMapping("/check") public R check(String password) { - return userService.checkPassword(password); + return userService.checkPassword(SecurityUtils.getUser().getUsername(),password); } /** diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java index 336066f5c..011d8c004 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java @@ -132,16 +132,35 @@ public interface SysUserService extends IService { /** * 锁定用户 * - * @param username - * @return + * @param username 用户名 + * @return R */ R lockUser(String username); + /** + * 修改密码 + * + * @param userDto 用户信息 + * @return + */ R changePassword(UserDTO userDto); + /** + * 解绑社交登录 + * + * @param type 社交登录类型 + * @return R + */ R unbinding(String type); - R checkPassword(String password); + /** + * 校验密码 + * + * @param username 用户名 + * @param password 密码 + * @return R + */ + R checkPassword(String username, String password); /** * 根据角色ID列表获取用户ID列表接口 @@ -158,4 +177,12 @@ public interface SysUserService extends IService { * @return List 返回结果对象,包含根据部门ID列表获取到的用户ID列表信息 */ List listUserIdByDeptIds(List deptIdList); + + /** + * 重置用户密码 + * + * @param userDto 用户信息 + * @return + */ + R resetUserPassword(UserDTO userDto); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java index c15cfcb01..f935f59f4 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/ConnectServiceImpl.java @@ -44,6 +44,7 @@ import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; @@ -156,6 +157,7 @@ public class ConnectServiceImpl implements ConnectService { userDTO.setEmail(userObj.getStr("email")); // 初始化密码为 手机号 userDTO.setPassword(userObj.getStr("mobile")); + userDTO.setPasswordModifyTime(LocalDateTime.now()); sysUserService.saveUser(userDTO); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java index d274b5dbc..158c42db0 100755 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysTenantServiceImpl.java @@ -43,6 +43,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -157,6 +158,7 @@ public class SysTenantServiceImpl extends ServiceImpl impl sysUser.setCreateBy(userDto.getUsername()); sysUser.setUpdateBy(userDto.getUsername()); sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + sysUser.setPasswordModifyTime(LocalDateTime.now()); baseMapper.insert(sysUser); // 保存用户岗位信息 Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { @@ -403,6 +405,7 @@ public class SysUserServiceImpl extends ServiceImpl impl userDTO.setEmail(excel.getEmail()); userDTO.setLockFlag(excel.getLockFlag()); // 批量导入初始密码为手机号 + userDTO.setPasswordModifyTime(LocalDateTime.now()); userDTO.setPassword(userDTO.getPhone()); // 根据部门名称查询部门ID userDTO.setDeptId(deptOptional.get().getDeptId()); @@ -481,6 +484,7 @@ public class SysUserServiceImpl extends ServiceImpl impl this.update(Wrappers.lambdaUpdate() .set(SysUser::getPassword, password) + .set(SysUser::getPasswordModifyTime, LocalDateTime.now()) .eq(SysUser::getUserId, user.getUserId())); return R.ok(); } @@ -522,8 +526,7 @@ public class SysUserServiceImpl extends ServiceImpl impl } @Override - public R checkPassword(String password) { - String username = SecurityUtils.getUser().getUsername(); + public R checkPassword(String username, String password) { SysUser condition = new SysUser(); condition.setUsername(username); SysUser sysUser = this.getOne(new QueryWrapper<>(condition)); @@ -536,6 +539,36 @@ public class SysUserServiceImpl extends ServiceImpl impl } } + /** + * 重置用户密码 + * + * @param userDto 用户信息 + * @return + */ + @Override + @CacheEvict(value = CacheConstants.USER_DETAILS, key = "#userDto.username") + public R resetUserPassword(UserDTO userDto) { + // 校验密码 + R checkedPassword = checkPassword(userDto.getUsername(), userDto.getPassword()); + if (!checkedPassword.isOk()) { + return checkedPassword; + } + + // 新密码校验 + if (StrUtil.equals(userDto.getPassword(), userDto.getNewpassword1())) { + return R.failed("新旧密码不能相同"); + } + + // 重置密码 + String password = ENCODER.encode(userDto.getNewpassword1()); + this.update(Wrappers.lambdaUpdate() + .set(SysUser::getPassword, password) + .set(SysUser::getPasswordModifyTime, LocalDateTime.now()) + .set(SysUser::getPasswordExpireFlag, CommonConstants.STATUS_NORMAL) + .eq(SysUser::getUsername, userDto.getUsername())); + return R.ok(); + } + @Override public List listUserIdByRoleIds(List roleIdList) { return sysUserRoleMapper.selectList(Wrappers.lambdaQuery().in(SysUserRole::getRoleId, roleIdList)) diff --git a/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysUserMapper.xml b/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysUserMapper.xml index fe98b08ca..c148efe51 100644 --- a/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -35,6 +35,8 @@ + + @@ -62,6 +64,8 @@ u.dept_id, u.del_flag, u.lock_flag, + u.password_expire_flag, + u.password_modify_time, u.tenant_id, u.create_by, u.create_time ucreate_time, @@ -87,6 +91,8 @@ u.osc_id, u.del_flag, u.lock_flag, + u.password_expire_flag, + u.password_modify_time, u.tenant_id, u.nickname, u.name, @@ -134,6 +140,8 @@ u.update_time uupdate_time, u.del_flag, u.lock_flag, + u.password_expire_flag, + u.password_modify_time, u.tenant_id, u.nickname, u.name, @@ -178,6 +186,8 @@ u.update_time uupdate_time, u.del_flag, u.lock_flag, + u.password_expire_flag, + u.password_modify_time, u.tenant_id, u.nickname, u.name,