You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

177 lines
6.6 KiB

1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
  1. package com.example.demo.serviceImpl;
  2. import com.example.demo.domain.entity.Admin;
  3. import com.example.demo.domain.vo.Password;
  4. import com.example.demo.domain.vo.Result;
  5. import com.example.demo.mapper.AdminMapper;
  6. import com.example.demo.service.AdminService;
  7. import lombok.RequiredArgsConstructor;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.security.authentication.AuthenticationManager;
  10. import org.springframework.security.authentication.BadCredentialsException;
  11. import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  12. import org.springframework.security.core.Authentication;
  13. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  14. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  15. import org.springframework.stereotype.Service;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import java.time.LocalDateTime;
  20. import java.util.Date;
  21. import java.util.regex.Pattern;
  22. @Service
  23. @RequiredArgsConstructor
  24. public class AdminServiceImpl implements AdminService {
  25. @Autowired
  26. private AuthenticationManager authenticationManager;
  27. private final AdminMapper adminMapper;
  28. @Override
  29. public Admin login(Admin admin) throws Exception {
  30. String account = admin.getAccount();
  31. String inputMachineId = admin.getMachineId();
  32. if (StringUtils.isBlank(account)) {
  33. throw new IllegalArgumentException("账号不能为空");
  34. }
  35. Admin adminInDB = adminMapper.getAdmin(account);
  36. System.out.println("adminInDB:" + adminInDB);
  37. if (adminInDB == null) {
  38. throw new RuntimeException("无此精网号");
  39. }
  40. // 校验机器权限
  41. if (!hasPermissionToMachine(adminInDB, inputMachineId)) {
  42. throw new RuntimeException("你没有使用该机器的权限!");
  43. }
  44. try {
  45. System.out.println("admin:" + account);
  46. System.out.println("admin:" + admin.getPassword());
  47. UsernamePasswordAuthenticationToken token =
  48. new UsernamePasswordAuthenticationToken(account, admin.getPassword());
  49. Authentication authentication = authenticationManager.authenticate(token);
  50. return (Admin) authentication.getPrincipal();
  51. } catch (Exception e) {
  52. System.out.println("密码错误" + e.getMessage());
  53. throw new RuntimeException("登录失败,请稍后再试", e);
  54. }
  55. }
  56. @Override
  57. public String getId(String account) {
  58. return adminMapper.getAdmin(account).getId().toString();
  59. }
  60. private boolean hasPermissionToMachine(Admin admin, String targetMachineId) {
  61. if (targetMachineId == null || admin.getMachineId() == null) {
  62. return false;
  63. }
  64. String[] machineIds = admin.getMachineId().split(",");
  65. for (String id : machineIds) {
  66. if (targetMachineId.equals(id)) {
  67. return true;
  68. }
  69. }
  70. return false;
  71. }
  72. private static final String PASSWORD_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)(?!\\W+$).{8,16}$";
  73. private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX);
  74. @Override
  75. public Result updatePassword(Password password) {
  76. String oldPassword = password.getOldPassword();
  77. String newPassword = password.getNewPassword();
  78. String againPassword = password.getAgainPassword();
  79. if(oldPassword == null || newPassword == null || againPassword == null ||password.getAccount() == null) {
  80. return Result.error("输入不能为空");
  81. }
  82. if (oldPassword.equals(newPassword)) {
  83. return Result.error("新密码不能与旧密码相同");
  84. }
  85. // 检查两次输入的新密码是否一致
  86. if (!newPassword.equals(againPassword)) {
  87. return Result.error("两次输入的新密码不一致");
  88. }
  89. // 检查新密码是否符合复杂度要求
  90. if (!PASSWORD_PATTERN.matcher(newPassword).matches()) {
  91. return Result.error("新密码必须为8-16位数字、字母或符号组成,且至少包含其中两种");
  92. }
  93. if(adminMapper.getAdmin(password.getAccount())==null)
  94. {
  95. return Result.error("用户不存在");
  96. }
  97. try {
  98. // 创建认证令牌并验证旧密码
  99. UsernamePasswordAuthenticationToken token =
  100. new UsernamePasswordAuthenticationToken(password.getAccount(), oldPassword);
  101. Authentication authentication = authenticationManager.authenticate(token);
  102. // 获取认证后的用户信息
  103. Admin admin = (Admin) authentication.getPrincipal();
  104. BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
  105. // 使用Spring管理的密码编码器(不要手动new)
  106. String encodedPassword = passwordEncoder.encode(newPassword);
  107. // 更新数据库中的密码
  108. admin.setPassword(encodedPassword);
  109. admin.setUpdateTime(new Date()); // 更新修改时间
  110. adminMapper.updatePassword(admin);
  111. return Result.success("密码修改成功");
  112. } catch (BadCredentialsException e) {
  113. // 旧密码验证失败
  114. return Result.error("原密码错误");
  115. }
  116. catch (Exception e) {
  117. return Result.error("密码更新失败");
  118. }
  119. }
  120. @Override
  121. public Integer resetPassword(Password password) {
  122. String newPassword = password.getNewPassword();
  123. if(newPassword == null ||password.getAccount() == null) {
  124. return 0;
  125. }
  126. // 检查新密码是否符合复杂度要求
  127. if (!PASSWORD_PATTERN.matcher(newPassword).matches()) {
  128. return 0;
  129. }
  130. if(adminMapper.getAdmin(password.getAccount())==null)
  131. {
  132. return 0;
  133. }
  134. try {
  135. // 获取认证后的用户信息
  136. Admin admin = adminMapper.getAdmin(password.getAccount());
  137. BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
  138. // 使用Spring管理的密码编码器(不要手动new)
  139. String encodedPassword = passwordEncoder.encode(newPassword);
  140. // 更新数据库中的密码
  141. admin.setPassword(encodedPassword);
  142. admin.setUpdateTime(new Date()); // 更新修改时间
  143. adminMapper.updatePassword(admin);
  144. return 1;
  145. }
  146. catch (Exception e) {
  147. return 0;
  148. }
  149. }
  150. }