mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 16:23:42 +08:00 
			
		
		
		
	update 优化 更新角色后踢掉所有相关的登录用户 用户量过大会导致redis阻塞卡顿(应粉丝要求)
This commit is contained in:
		@@ -71,6 +71,13 @@ public class LoginHelper {
 | 
				
			|||||||
        return loginUser;
 | 
					        return loginUser;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取用户基于token
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static LoginUser getLoginUser(String token) {
 | 
				
			||||||
 | 
					        return ((JSONObject) StpUtil.getExtra(token, LOGIN_USER_KEY)).toBean(LoginUser.class);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取用户id
 | 
					     * 获取用户id
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,19 @@
 | 
				
			|||||||
package com.ruoyi.system.controller.system;
 | 
					package com.ruoyi.system.controller.system;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.dev33.satoken.annotation.SaCheckPermission;
 | 
					import cn.dev33.satoken.annotation.SaCheckPermission;
 | 
				
			||||||
 | 
					import cn.dev33.satoken.exception.NotLoginException;
 | 
				
			||||||
 | 
					import cn.dev33.satoken.stp.StpUtil;
 | 
				
			||||||
 | 
					import cn.hutool.core.collection.CollUtil;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.constant.GlobalConstants;
 | 
				
			||||||
import com.ruoyi.common.core.constant.UserConstants;
 | 
					import com.ruoyi.common.core.constant.UserConstants;
 | 
				
			||||||
import com.ruoyi.common.core.domain.R;
 | 
					import com.ruoyi.common.core.domain.R;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.domain.model.LoginUser;
 | 
				
			||||||
import com.ruoyi.common.excel.utils.ExcelUtil;
 | 
					import com.ruoyi.common.excel.utils.ExcelUtil;
 | 
				
			||||||
import com.ruoyi.common.log.annotation.Log;
 | 
					import com.ruoyi.common.log.annotation.Log;
 | 
				
			||||||
import com.ruoyi.common.log.enums.BusinessType;
 | 
					import com.ruoyi.common.log.enums.BusinessType;
 | 
				
			||||||
import com.ruoyi.common.mybatis.core.page.PageQuery;
 | 
					import com.ruoyi.common.mybatis.core.page.PageQuery;
 | 
				
			||||||
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
 | 
					import com.ruoyi.common.mybatis.core.page.TableDataInfo;
 | 
				
			||||||
 | 
					import com.ruoyi.common.satoken.utils.LoginHelper;
 | 
				
			||||||
import com.ruoyi.common.web.core.BaseController;
 | 
					import com.ruoyi.common.web.core.BaseController;
 | 
				
			||||||
import com.ruoyi.system.domain.SysDept;
 | 
					import com.ruoyi.system.domain.SysDept;
 | 
				
			||||||
import com.ruoyi.system.domain.SysUserRole;
 | 
					import com.ruoyi.system.domain.SysUserRole;
 | 
				
			||||||
@@ -107,14 +113,25 @@ public class SysRoleController extends BaseController {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (roleService.updateRole(role) > 0) {
 | 
					        if (roleService.updateRole(role) > 0) {
 | 
				
			||||||
//            // 更新缓存用户权限
 | 
					            List<String> keys = StpUtil.searchTokenValue("", 0, -1, false);
 | 
				
			||||||
//            LoginUser loginUser = LoginHelper.getLoginUser();
 | 
					            if (CollUtil.isEmpty(keys)) {
 | 
				
			||||||
//            SysUserVo sysUser = userService.selectUserById(loginUser.getUserId());
 | 
					                return R.ok();
 | 
				
			||||||
//            if (ObjectUtil.isNotNull(sysUser)) {
 | 
					            }
 | 
				
			||||||
//                loginUser.setMenuPermission(permissionService.getMenuPermission(sysUser.getUserId()));
 | 
					            // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作
 | 
				
			||||||
//                LoginHelper.setLoginUser(loginUser);
 | 
					            keys.parallelStream().forEach(key -> {
 | 
				
			||||||
//            }
 | 
					                String token = key.replace(GlobalConstants.LOGIN_TOKEN_KEY, "");
 | 
				
			||||||
            // todo LoginUser 改为存储到token内部 无法热更新 等待后续想办法
 | 
					                // 如果已经过期则跳过
 | 
				
			||||||
 | 
					                if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) {
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                LoginUser loginUser = LoginHelper.getLoginUser(token);
 | 
				
			||||||
 | 
					                if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(role.getRoleId()))) {
 | 
				
			||||||
 | 
					                    try {
 | 
				
			||||||
 | 
					                        StpUtil.logoutByTokenValue(token);
 | 
				
			||||||
 | 
					                    } catch (NotLoginException ignored) {
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
            return R.ok();
 | 
					            return R.ok();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
 | 
					        return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user