LoginHelper.java 4.1 KB

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