AbstractLoginHandler.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package com.pavis.admin.auth;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.dev33.satoken.stp.parameter.SaLoginParameter;
  4. import cn.hutool.core.bean.BeanUtil;
  5. import jakarta.annotation.Resource;
  6. import jakarta.servlet.http.HttpServletRequest;
  7. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  8. import org.springframework.stereotype.Component;
  9. import com.pavis.admin.auth.model.req.LoginReq;
  10. import com.pavis.admin.common.context.RoleContext;
  11. import com.pavis.admin.common.context.UserContext;
  12. import com.pavis.admin.common.context.UserContextHolder;
  13. import com.pavis.admin.common.context.UserExtraContext;
  14. import com.pavis.admin.common.enums.DisEnableStatusEnum;
  15. import com.pavis.admin.system.model.entity.DeptDO;
  16. import com.pavis.admin.system.model.entity.user.UserDO;
  17. import com.pavis.admin.system.model.resp.ClientResp;
  18. import com.pavis.admin.system.service.DeptService;
  19. import com.pavis.admin.system.service.OptionService;
  20. import com.pavis.admin.system.service.RoleService;
  21. import com.pavis.admin.system.service.UserService;
  22. import top.continew.starter.core.validation.CheckUtils;
  23. import top.continew.starter.core.validation.Validator;
  24. import top.continew.starter.web.util.ServletUtils;
  25. import java.util.Set;
  26. import java.util.concurrent.CompletableFuture;
  27. import static com.pavis.admin.system.enums.PasswordPolicyEnum.PASSWORD_EXPIRATION_DAYS;
  28. /**
  29. * 登录处理器基类
  30. *
  31. *
  32. *
  33. * @since 2024/12/22 14:52
  34. */
  35. @Component
  36. public abstract class AbstractLoginHandler<T extends LoginReq> implements LoginHandler<T> {
  37. @Resource
  38. protected OptionService optionService;
  39. @Resource
  40. protected UserService userService;
  41. @Resource
  42. protected RoleService roleService;
  43. @Resource
  44. private DeptService deptService;
  45. @Resource
  46. private ThreadPoolTaskExecutor threadPoolTaskExecutor;
  47. protected static final String CAPTCHA_EXPIRED = "验证码已失效";
  48. protected static final String CAPTCHA_ERROR = "验证码不正确";
  49. protected static final String CLIENT_ID = "clientId";
  50. @Override
  51. public void preLogin(T req, ClientResp client, HttpServletRequest request) {
  52. // 参数校验
  53. Validator.validate(req);
  54. }
  55. @Override
  56. public void postLogin(T req, ClientResp client, HttpServletRequest request) {
  57. }
  58. /**
  59. * 认证
  60. *
  61. * @param user 用户信息
  62. * @param client 客户端信息
  63. * @return token 令牌信息
  64. */
  65. protected String authenticate(UserDO user, ClientResp client) {
  66. // 获取权限、角色、密码过期天数
  67. Long userId = user.getId();
  68. CompletableFuture<Set<String>> permissionFuture = CompletableFuture.supplyAsync(() -> roleService
  69. .listPermissionByUserId(userId), threadPoolTaskExecutor);
  70. CompletableFuture<Set<RoleContext>> roleFuture = CompletableFuture.supplyAsync(() -> roleService
  71. .listByUserId(userId), threadPoolTaskExecutor);
  72. CompletableFuture<Integer> passwordExpirationDaysFuture = CompletableFuture.supplyAsync(() -> optionService
  73. .getValueByCode2Int(PASSWORD_EXPIRATION_DAYS.name()));
  74. CompletableFuture.allOf(permissionFuture, roleFuture, passwordExpirationDaysFuture);
  75. UserContext userContext = new UserContext(permissionFuture.join(), roleFuture
  76. .join(), passwordExpirationDaysFuture.join());
  77. BeanUtil.copyProperties(user, userContext);
  78. // 设置登录配置参数
  79. SaLoginParameter loginParameter = new SaLoginParameter();
  80. loginParameter.setActiveTimeout(client.getActiveTimeout());
  81. loginParameter.setTimeout(client.getTimeout());
  82. loginParameter.setDeviceType(client.getClientType());
  83. userContext.setClientType(client.getClientType());
  84. loginParameter.setExtra(CLIENT_ID, client.getClientId());
  85. userContext.setClientId(client.getClientId());
  86. // 登录并缓存用户信息
  87. StpUtil.login(userContext.getId(), loginParameter.setExtraData(BeanUtil
  88. .beanToMap(new UserExtraContext(ServletUtils.getRequest()))));
  89. UserContextHolder.setContext(userContext);
  90. return StpUtil.getTokenValue();
  91. }
  92. /**
  93. * 检查用户状态
  94. *
  95. * @param user 用户信息
  96. */
  97. protected void checkUserStatus(UserDO user) {
  98. CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, user.getStatus(), "此账号已被禁用,如有疑问,请联系管理员");
  99. DeptDO dept = new DeptDO();
  100. if (user.getDeptId() != null) {
  101. dept = deptService.getById(user.getDeptId());
  102. } else {
  103. dept = deptService.getById(1);
  104. }
  105. CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, dept.getStatus(), "此账号所属部门已被禁用,如有疑问,请联系管理员");
  106. }
  107. }