LoginHelper.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package com.ruoyi.common.helper;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.ruoyi.common.core.domain.model.LoginUser;
  5. import com.ruoyi.common.enums.DeviceType;
  6. import com.ruoyi.common.enums.UserType;
  7. import com.ruoyi.common.exception.UtilException;
  8. import com.ruoyi.common.utils.StringUtils;
  9. import lombok.AccessLevel;
  10. import lombok.NoArgsConstructor;
  11. /**
  12. * 登录鉴权助手
  13. * 为适配多端登录而封装
  14. *
  15. * @author Lion Li
  16. */
  17. @NoArgsConstructor(access = AccessLevel.PRIVATE)
  18. public class LoginHelper {
  19. public static final String JOIN_CODE = ":";
  20. public static final String LOGIN_USER_KEY = "loginUser";
  21. private static final ThreadLocal<LoginUser> LOGIN_CACHE = new ThreadLocal<>();
  22. /**
  23. * 登录系统
  24. * 针对两套用户体系
  25. *
  26. * @param loginUser 登录用户信息
  27. */
  28. public static void login(LoginUser loginUser) {
  29. StpUtil.login(loginUser.getLoginId());
  30. setLoginUser(loginUser);
  31. }
  32. /**
  33. * 登录系统 基于 设备类型
  34. * 针对一套用户体系
  35. *
  36. * @param loginUser 登录用户信息
  37. */
  38. public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) {
  39. StpUtil.login(loginUser.getLoginId(), deviceType.getDevice());
  40. setLoginUser(loginUser);
  41. }
  42. /**
  43. * 设置用户数据(多级缓存)
  44. */
  45. public static void setLoginUser(LoginUser loginUser) {
  46. StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
  47. LOGIN_CACHE.set(loginUser);
  48. }
  49. /**
  50. * 获取用户(多级缓存)
  51. */
  52. public static LoginUser getLoginUser() {
  53. LoginUser loginUser = LOGIN_CACHE.get();
  54. if (loginUser != null) {
  55. return loginUser;
  56. }
  57. return (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY);
  58. }
  59. /**
  60. * 清除一级缓存 防止内存问题
  61. */
  62. public static void clearCache() {
  63. LOGIN_CACHE.remove();
  64. }
  65. /**
  66. * 获取用户id
  67. */
  68. public static Long getUserId() {
  69. LoginUser loginUser = getLoginUser();
  70. if (ObjectUtil.isNull(loginUser)) {
  71. String loginId = StpUtil.getLoginIdAsString();
  72. String userId = null;
  73. for (UserType value : UserType.values()) {
  74. if (StringUtils.contains(loginId, value.getUserType())) {
  75. String[] strs = StringUtils.split(loginId, JOIN_CODE);
  76. // 用户id在总是在最后
  77. userId = strs[strs.length - 1];
  78. }
  79. }
  80. if (StringUtils.isBlank(userId)) {
  81. throw new UtilException("登录用户: LoginId异常 => " + loginId);
  82. }
  83. return Long.parseLong(userId);
  84. }
  85. return loginUser.getUserId();
  86. }
  87. /**
  88. * 获取部门ID
  89. */
  90. public static Long getDeptId() {
  91. return getLoginUser().getDeptId();
  92. }
  93. /**
  94. * 获取用户账户
  95. */
  96. public static String getUsername() {
  97. return getLoginUser().getUsername();
  98. }
  99. /**
  100. * 获取用户类型
  101. */
  102. public static UserType getUserType() {
  103. String loginId = StpUtil.getLoginIdAsString();
  104. return UserType.getUserType(loginId);
  105. }
  106. }