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.

213 lines
8.2 KiB

5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
4 months ago
5 months ago
5 months ago
5 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
4 months ago
5 months ago
5 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
  1. package com.example.demo.serviceImpl.coin;
  2. import com.example.demo.domain.entity.Admin;
  3. import com.example.demo.domain.vo.coin.Password;
  4. import com.example.demo.domain.vo.coin.Result;
  5. import com.example.demo.mapper.coin.AdminMapper;
  6. import com.example.demo.service.coin.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.context.SecurityContextHolder;
  14. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  15. import org.springframework.stereotype.Service;
  16. import org.apache.commons.lang3.StringUtils;
  17. import java.util.Date;
  18. import java.util.regex.Pattern;
  19. @Service
  20. @RequiredArgsConstructor
  21. public class AdminServiceImpl implements AdminService {
  22. @Autowired
  23. private AuthenticationManager authenticationManager;
  24. private final AdminMapper adminMapper;
  25. @Override
  26. public Admin login(Admin admin) throws Exception {
  27. String account = admin.getAccount();
  28. String inputMachineId = admin.getMachineId();
  29. if (StringUtils.isBlank(account)) {
  30. throw new IllegalArgumentException("账号不能为空");
  31. }
  32. Admin adminInDB = adminMapper.getAdmin(account);
  33. // System.out.println("adminInDB:" + adminInDB);
  34. if (adminInDB == null) {
  35. throw new RuntimeException("无此精网号");
  36. }
  37. // 校验机器权限
  38. if (!hasPermissionToMachine(adminInDB, inputMachineId)) {
  39. throw new RuntimeException("你没有使用该机器的权限!");
  40. }
  41. try {
  42. // System.out.println("admin:" + account);
  43. // System.out.println("admin:" + admin.getPassword());
  44. UsernamePasswordAuthenticationToken token =
  45. new UsernamePasswordAuthenticationToken(account, admin.getPassword());
  46. Authentication authentication = authenticationManager.authenticate(token);
  47. SecurityContextHolder.getContext().setAuthentication(authentication); // 存储认证信息
  48. Admin authenticatedAdmin = (Admin) authentication.getPrincipal();
  49. // System.out.println("authenticatedAdmin markets: " + authenticatedAdmin.getMarkets()); // 添加日志检查
  50. return authenticatedAdmin;
  51. } catch (Exception e) {
  52. System.out.println("密码错误" + e.getMessage());
  53. throw new RuntimeException("登录失败,请稍后再试", e);
  54. }
  55. }
  56. //获取用户ID
  57. @Override
  58. public String getId(String account) {
  59. return adminMapper.getAdmin(account).getId().toString();
  60. }
  61. @Override
  62. public String getName(String account) {
  63. return adminMapper.getName(account);
  64. }
  65. private boolean hasPermissionToMachine(Admin admin, String targetMachineId) {
  66. if (targetMachineId == null || admin.getMachineId() == null) {
  67. return false;
  68. }
  69. String[] machineIds = admin.getMachineId().split(",");
  70. for (String id : machineIds) {
  71. if (targetMachineId.equals(id)) {
  72. return true;
  73. }
  74. }
  75. return false;
  76. }
  77. private static final String PASSWORD_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)(?!\\W+$)[a-zA-Z0-9!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]{8,16}$";
  78. private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX);
  79. //更新密码
  80. @Override
  81. public Result updatePassword(Password password) {
  82. String oldPassword = password.getOldPassword();
  83. String newPassword = password.getNewPassword();
  84. String againPassword = password.getAgainPassword();
  85. // 校验输入参数是否为空(账号、旧密码、新密码、确认密码均不可为空)
  86. if(oldPassword == null || newPassword == null || againPassword == null ||password.getAccount() == null) {
  87. return Result.error("输入不能为空");
  88. }
  89. // 检查两次输入的新密码是否一致
  90. if (!newPassword.equals(againPassword)) {
  91. return Result.error("两次输入的新密码不一致,请核对后重新输入");
  92. }
  93. // 检查新密码是否符合复杂度要求
  94. if (!PASSWORD_PATTERN.matcher(newPassword).matches()) {
  95. return Result.error("新密码必须为8-16位数字、字母或符号组成,且至少包含其中两种");
  96. }
  97. if(adminMapper.getAdmin(password.getAccount())==null)
  98. {
  99. return Result.error("用户不存在");
  100. }
  101. // 校验新密码是否与旧密码相同(不允许相同)
  102. if (oldPassword.equals(newPassword)) {
  103. return Result.error("新密码与历史密码重复");
  104. }
  105. try {
  106. // 创建认证令牌并验证旧密码
  107. UsernamePasswordAuthenticationToken token =
  108. new UsernamePasswordAuthenticationToken(password.getAccount(), oldPassword);
  109. Authentication authentication = authenticationManager.authenticate(token);
  110. // 获取认证后的用户信息
  111. Admin admin = (Admin) authentication.getPrincipal();
  112. BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
  113. // 使用Spring管理的密码编码器(不要手动new)
  114. String encodedPassword = passwordEncoder.encode(newPassword);
  115. // 更新数据库中的密码
  116. admin.setPassword(encodedPassword);
  117. admin.setUpdateTime(new Date()); // 更新修改时间
  118. adminMapper.updatePassword(admin);
  119. return Result.success("密码修改成功");
  120. } catch (BadCredentialsException e) {
  121. // 旧密码验证失败
  122. return Result.error("原密码错误,请重新输入");
  123. }
  124. catch (Exception e) {
  125. return Result.error("密码更新失败");
  126. }
  127. }
  128. //重置密码
  129. @Override
  130. public Result resetPassword(Password password) {
  131. String newPassword = "123456";
  132. if(password.getAccount() == null) {
  133. return Result.error("账户未输入");
  134. }
  135. if(adminMapper.getAdmin(password.getAccount())==null)
  136. {
  137. return Result.error("账户查找不到");
  138. }
  139. try {
  140. // 获取认证后的用户信息
  141. Admin admin = adminMapper.getAdmin(password.getAccount());
  142. BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
  143. // 使用Spring管理的密码编码器(不要手动new)
  144. String encodedPassword = passwordEncoder.encode(newPassword);
  145. // 更新数据库中的密码
  146. admin.setPassword(encodedPassword);
  147. admin.setUpdateTime(new Date()); // 更新修改时间
  148. adminMapper.updatePassword(admin);
  149. return Result.success("密码重置成功");
  150. }
  151. catch (Exception e) {
  152. return Result.error("其他错误");
  153. }
  154. }
  155. public String getCurrentAdminAccount() {
  156. // 1. 从 Security 上下文获取认证信息
  157. Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
  158. // 2. 校验认证状态(未登录则抛出异常)
  159. if (authentication == null) {
  160. throw new RuntimeException("当前用户未登录");
  161. }
  162. // 3. 获取登录用户的主体信息(principal)
  163. Object principal = authentication.getPrincipal();
  164. // 4. 校验主体类型是否为 Admin(确保类型匹配)
  165. if (!(principal instanceof Admin)) {
  166. throw new RuntimeException("登录用户类型错误,不是 Admin");
  167. }
  168. // 5. 转换为 Admin 对象并获取 account 属性
  169. Admin currentAdmin = (Admin) principal;
  170. String account = currentAdmin.getAccount();
  171. // 6. 校验 account 不为空(根据业务需求可选)
  172. if (account == null || account.trim().isEmpty()) {
  173. throw new RuntimeException("当前 Admin 的 account 属性为空");
  174. }
  175. return account;
  176. }
  177. }