From 380cb2db29b6918f7c37394de09c88ed6910b9e8 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期五, 17 二月 2023 22:45:59 +0800 Subject: [PATCH] fix 修复 因菜单权限过多 导致 token 臃肿过长问题 --- ruoyi-common/ruoyi-common-satoken/src/main/java/com/ruoyi/common/satoken/utils/LoginHelper.java | 110 ++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 72 insertions(+), 38 deletions(-) diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/com/ruoyi/common/satoken/utils/LoginHelper.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/com/ruoyi/common/satoken/utils/LoginHelper.java index 0ae9016..b8f35b2 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/com/ruoyi/common/satoken/utils/LoginHelper.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/com/ruoyi/common/satoken/utils/LoginHelper.java @@ -1,24 +1,27 @@ package com.ruoyi.common.satoken.utils; import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import com.ruoyi.common.core.constant.TenantConstants; import com.ruoyi.common.core.constant.UserConstants; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.core.enums.DeviceType; import com.ruoyi.common.core.enums.UserType; -import com.ruoyi.common.core.exception.UtilException; -import com.ruoyi.common.core.utils.StringUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import java.util.Set; + /** * 鐧诲綍閴存潈鍔╂墜 - * + * <p> * user_type 涓� 鐢ㄦ埛绫诲瀷 鍚屼竴涓敤鎴疯〃 鍙互鏈夊绉嶇敤鎴风被鍨� 渚嬪 pc,app * deivce 涓� 璁惧绫诲瀷 鍚屼竴涓敤鎴风被鍨� 鍙互鏈� 澶氱璁惧绫诲瀷 渚嬪 web,ios * 鍙互缁勬垚 鐢ㄦ埛绫诲瀷涓庤澶囩被鍨嬪瀵瑰鐨� 鏉冮檺鐏垫椿鎺у埗 - * + * <p> * 澶氱敤鎴蜂綋绯� 閽堝 澶氱鐢ㄦ埛绫诲瀷 浣嗘潈闄愭帶鍒朵笉涓�鑷� * 鍙互缁勬垚 澶氱敤鎴风被鍨嬭〃涓庡璁惧绫诲瀷 鍒嗗埆鎺у埗鏉冮檺 * @@ -27,8 +30,8 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class LoginHelper { - public static final String JOIN_CODE = ":"; public static final String LOGIN_USER_KEY = "loginUser"; + public static final String MENU_PERMISSION = "menuPermission"; /** * 鐧诲綍绯荤粺 @@ -36,9 +39,7 @@ * @param loginUser 鐧诲綍鐢ㄦ埛淇℃伅 */ public static void login(LoginUser loginUser) { - SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser); - StpUtil.login(loginUser.getLoginId()); - setLoginUser(loginUser); + loginByDevice(loginUser, null); } /** @@ -49,27 +50,43 @@ */ public static void loginByDevice(LoginUser loginUser, DeviceType deviceType) { SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser); - StpUtil.login(loginUser.getLoginId(), deviceType.getDevice()); - setLoginUser(loginUser); - } - - /** - * 璁剧疆鐢ㄦ埛鏁版嵁(澶氱骇缂撳瓨) - */ - public static void setLoginUser(LoginUser loginUser) { - StpUtil.getTokenSession().set(LOGIN_USER_KEY, loginUser); + Set<String> menuPermission = loginUser.getMenuPermission(); + loginUser.setMenuPermission(null); + SaLoginModel model = new SaLoginModel(); + if (ObjectUtil.isNotNull(deviceType)) { + model.setDevice(deviceType.getDevice()); + } + StpUtil.login(loginUser.getLoginId(), model.setExtra(LOGIN_USER_KEY, loginUser)); + // 瑙e喅鑿滃崟鏉冮檺杩囧害 token 鑷冭偪杩囬暱闂 + StpUtil.getTokenSession().set(MENU_PERMISSION, menuPermission); } /** * 鑾峰彇鐢ㄦ埛(澶氱骇缂撳瓨) */ + @SuppressWarnings("unchecked cast") public static LoginUser getLoginUser() { LoginUser loginUser = (LoginUser) SaHolder.getStorage().get(LOGIN_USER_KEY); if (loginUser != null) { return loginUser; } - loginUser = (LoginUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY); + loginUser = ((JSONObject) StpUtil.getExtra(LOGIN_USER_KEY)).toBean(LoginUser.class); + // 瑙e喅鑿滃崟鏉冮檺杩囧害 token 鑷冭偪杩囬暱闂 + Set<String> menuPermission = (Set<String>) StpUtil.getTokenSession().get(MENU_PERMISSION); + loginUser.setMenuPermission(menuPermission); SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser); + return loginUser; + } + + /** + * 鑾峰彇鐢ㄦ埛鍩轰簬token + */ + @SuppressWarnings("unchecked cast") + public static LoginUser getLoginUser(String token) { + LoginUser loginUser = ((JSONObject) StpUtil.getExtra(token, LOGIN_USER_KEY)).toBean(LoginUser.class); + // 瑙e喅鑿滃崟鏉冮檺杩囧害 token 鑷冭偪杩囬暱闂 + Set<String> menuPermission = (Set<String>) StpUtil.getTokenSessionByToken(token).get(MENU_PERMISSION); + loginUser.setMenuPermission(menuPermission); return loginUser; } @@ -77,23 +94,26 @@ * 鑾峰彇鐢ㄦ埛id */ public static Long getUserId() { - LoginUser loginUser = getLoginUser(); - if (ObjectUtil.isNull(loginUser)) { - String loginId = StpUtil.getLoginIdAsString(); - String userId = null; - for (UserType value : UserType.values()) { - if (StringUtils.contains(loginId, value.getUserType())) { - String[] strs = StringUtils.split(loginId, JOIN_CODE); - // 鐢ㄦ埛id鍦ㄦ�绘槸鍦ㄦ渶鍚� - userId = strs[strs.length - 1]; - } - } - if (StringUtils.isBlank(userId)) { - throw new UtilException("鐧诲綍鐢ㄦ埛: LoginId寮傚父 => " + loginId); - } - return Long.parseLong(userId); + LoginUser loginUser; + try { + loginUser = getLoginUser(); + } catch (Exception e) { + return null; } return loginUser.getUserId(); + } + + /** + * 鑾峰彇绉熸埛ID + */ + public static String getTenantId() { + LoginUser loginUser; + try { + loginUser = getLoginUser(); + } catch (Exception e) { + return null; + } + return loginUser.getTenantId(); } /** @@ -119,17 +139,31 @@ } /** - * 鏄惁涓虹鐞嗗憳 + * 鏄惁涓鸿秴绾х鐞嗗憳 * * @param userId 鐢ㄦ埛ID * @return 缁撴灉 */ - public static boolean isAdmin(Long userId) { - return UserConstants.ADMIN_ID.equals(userId); + public static boolean isSuperAdmin(Long userId) { + return UserConstants.SUPER_ADMIN_ID.equals(userId); } - public static boolean isAdmin() { - return isAdmin(getUserId()); + public static boolean isSuperAdmin() { + return isSuperAdmin(getUserId()); + } + + /** + * 鏄惁涓鸿秴绾х鐞嗗憳 + * + * @param rolePermission 瑙掕壊鏉冮檺鏍囪瘑缁� + * @return 缁撴灉 + */ + public static boolean isTenantAdmin(Set<String> rolePermission) { + return rolePermission.contains(TenantConstants.TENANT_ADMIN_ROLE_KEY); + } + + public static boolean isTenantAdmin() { + return isTenantAdmin(getLoginUser().getRolePermission()); } } -- Gitblit v1.9.3