LoginHelper.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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.constant.UserConstants;
  5. import com.ruoyi.common.core.domain.model.LoginUser;
  6. import com.ruoyi.common.enums.DeviceType;
  7. import com.ruoyi.common.enums.UserType;
  8. import com.ruoyi.common.exception.UtilException;
  9. import com.ruoyi.common.utils.StringUtils;
  10. import lombok.AccessLevel;
  11. import lombok.NoArgsConstructor;
  12. /**
  13. * 登录鉴权助手
  14. *
  15. * user_type 为 用户类型 同一个用户表 可以有多种用户类型 例如 pc,app
  16. * deivce 为 设备类型 同一个用户类型 可以有 多种设备类型 例如 web,ios
  17. * 可以组成 用户类型与设备类型多对多的 权限灵活控制
  18. *
  19. * 多用户体系 针对 多种用户类型 但权限控制不一致
  20. * 可以组成 多用户类型表与多设备类型 分别控制权限
  21. *
  22. * @author Lion Li
  23. */
  24. @NoArgsConstructor(access = AccessLevel.PRIVATE)
  25. public class LoginHelper {
  26. public static final String JOIN_CODE = ":";
  27. public static final String LOGIN_USER_KEY = "loginUser";
  28. private static final ThreadLocal<LoginUser> LOGIN_CACHE = new ThreadLocal<>();
  29. /**
  30. * 登录系统
  31. *
  32. * @param loginUser 登录用户信息
  33. */
  34. public static void login(LoginUser loginUser) {
  35. LOGIN_CACHE.set(loginUser);
  36. StpUtil.login(loginUser.getLoginId());
  37. setLoginUser(loginUser);
  38. }
  39. /**
  40. * 登录系统 基于 设备类型
  41. * 针对相同用户体系不同设备
  42. *
  43. * @param loginUser 登录用户信息
  44. */
  45. public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) {
  46. LOGIN_CACHE.set(loginUser);
  47. StpUtil.login(loginUser.getLoginId(), deviceType.getDevice());
  48. setLoginUser(loginUser);
  49. }
  50. /**
  51. * 设置用户数据(多级缓存)
  52. */
  53. public static void setLoginUser(LoginUser loginUser) {
  54. StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser);
  55. }
  56. /**
  57. * 获取用户(多级缓存)
  58. */
  59. public static LoginUser getLoginUser() {
  60. LoginUser loginUser = LOGIN_CACHE.get();
  61. if (loginUser != null) {
  62. return loginUser;
  63. }
  64. loginUser = (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY);
  65. LOGIN_CACHE.set(loginUser);
  66. return loginUser;
  67. }
  68. /**
  69. * 清除一级缓存 防止内存问题
  70. */
  71. public static void clearCache() {
  72. LOGIN_CACHE.remove();
  73. }
  74. /**
  75. * 获取用户id
  76. */
  77. public static Long getUserId() {
  78. LoginUser loginUser = getLoginUser();
  79. if (ObjectUtil.isNull(loginUser)) {
  80. String loginId = StpUtil.getLoginIdAsString();
  81. String userId = null;
  82. for (UserType value : UserType.values()) {
  83. if (StringUtils.contains(loginId, value.getUserType())) {
  84. String[] strs = StringUtils.split(loginId, JOIN_CODE);
  85. // 用户id在总是在最后
  86. userId = strs[strs.length - 1];
  87. }
  88. }
  89. if (StringUtils.isBlank(userId)) {
  90. throw new UtilException("登录用户: LoginId异常 => " + loginId);
  91. }
  92. return Long.parseLong(userId);
  93. }
  94. return loginUser.getUserId();
  95. }
  96. /**
  97. * 获取部门ID
  98. */
  99. public static Long getDeptId() {
  100. return getLoginUser().getDeptId();
  101. }
  102. /**
  103. * 获取用户账户
  104. */
  105. public static String getUsername() {
  106. return getLoginUser().getUsername();
  107. }
  108. /**
  109. * 获取用户类型
  110. */
  111. public static UserType getUserType() {
  112. String loginId = StpUtil.getLoginIdAsString();
  113. return UserType.getUserType(loginId);
  114. }
  115. /**
  116. * 是否为管理员
  117. *
  118. * @param userId 用户ID
  119. * @return 结果
  120. */
  121. public static boolean isAdmin(Long userId) {
  122. return UserConstants.ADMIN_ID.equals(userId);
  123. }
  124. public static boolean isAdmin() {
  125. return isAdmin(getUserId());
  126. }
  127. }