From 5efff965f3f61013a4e80150df16b432b85245af Mon Sep 17 00:00:00 2001 From: zhangrui Date: Tue, 22 Sep 2026 11:43:22 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E7=BC=93=E5=AD=98=E6=95=B4?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sys/services/impl/SysUserServiceImpl.java | 113 +++++++++--------- 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/src/main/java/io/v/nutz/sys/services/impl/SysUserServiceImpl.java b/src/main/java/io/v/nutz/sys/services/impl/SysUserServiceImpl.java index 56edd62..55a0a9a 100644 --- a/src/main/java/io/v/nutz/sys/services/impl/SysUserServiceImpl.java +++ b/src/main/java/io/v/nutz/sys/services/impl/SysUserServiceImpl.java @@ -8,13 +8,9 @@ import io.v.nutz.sys.services.SysDictService; import io.v.nutz.sys.services.SysMenuService; import io.v.nutz.sys.services.SysRoleService; import io.v.nutz.sys.services.SysUserService; -import io.v.nutz.web.commons.utils.ShiroUtil; -import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; -import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.SimplePrincipalCollection; -import org.apache.shiro.subject.Subject; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import org.nutz.aop.interceptor.ioc.TransAop; import org.nutz.dao.Cnd; @@ -34,7 +30,6 @@ import org.nutz.plugins.wkcache.annotation.CacheRemove; import org.nutz.plugins.wkcache.annotation.CacheRemoveAll; import org.nutz.plugins.wkcache.annotation.CacheResult; -import java.io.Serializable; import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; @@ -291,78 +286,80 @@ public class SysUserServiceImpl extends BaseServiceImpl implements Sys //可以通过el表达式加 * 通配符来批量删除一批缓存 public void deleteCache(String userId) { sysRoleService.clearCache(); - - //查询用户最新的菜单、角色信息 -// Sys_user user = fetch(Cnd.where("id", "=", userId)); -// fetchLinks(user, null); -// fillModuleMenus(user); -// fillUnitUnion(user); -// -// //更新principal信息 -// PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals(); -// String realm = principals.getRealmNames().iterator().next(); -// SimplePrincipalCollection simplePrincipalCollection = new SimplePrincipalCollection(user, realm); -// SecurityUtils.getSubject().runAs(simplePrincipalCollection); + flushUserPermissionById(userId); } @Override public void deleteCacheAndUpdate(String userId) { //删除sys_user_*,sys_role_*所有缓存 this.deleteCache(userId); - sysRoleService.clearCache(); - - //查询用户最新的菜单、角色信息 - Sys_user user = fetch(Cnd.where("id", "=", ShiroUtil.getUserId())); - fetchLinks(user, null); - user = fillModuleMenus(user); - user = fillUnitUnion(user); - - //更新principal信息 - PrincipalCollection principals = SecurityUtils.getSubject().getPrincipals(); - String realm = principals.getRealmNames().iterator().next(); - SimplePrincipalCollection simplePrincipalCollection = new SimplePrincipalCollection(user, realm); - SecurityUtils.getSubject().runAs(simplePrincipalCollection); } @Override public void flushOnlineUserPermission() { - + DefaultWebSessionManager sessionManager = Mvcs.getIoc().get(DefaultWebSessionManager.class, "shiroWebSessionManager"); + if (sessionManager == null || sessionManager.getSessionDAO() == null) { + return; + } + for (Session activeSession : sessionManager.getSessionDAO().getActiveSessions()) { + refreshSessionPermission(activeSession, null); + } } @Override - public void flushUserPermissionById(String id) { + public void flushUserPermissionById(String userId) { + if (Strings.isBlank(userId)) { + return; + } + DefaultWebSessionManager sessionManager = Mvcs.getIoc().get(DefaultWebSessionManager.class, "shiroWebSessionManager"); + if (sessionManager == null || sessionManager.getSessionDAO() == null) { + return; + } + for (Session activeSession : sessionManager.getSessionDAO().getActiveSessions()) { + refreshSessionPermission(activeSession, userId); + } + } + /** + * 刷新在线会话中的用户 Principal,保证菜单、角色和单位信息与数据库保持一致。 + * @param activeSession 在线 Shiro 会话 + * @param userId 指定用户 ID;为空时刷新当前会话对应的用户 + */ + private void refreshSessionPermission(Session activeSession, String userId) { + if (activeSession == null) { + return; + } + String sessionUserId = Strings.sNull(activeSession.getAttribute("platform_uid")); + if (Strings.isBlank(sessionUserId) || (Strings.isNotBlank(userId) && !userId.equals(sessionUserId))) { + return; + } + Sys_user user = fetch(Cnd.where("id", "=", sessionUserId)); + if (Lang.isEmpty(user)) { + return; + } + fetchLinks(user, null); + user = fillMenu(user); + user = fillModuleMenus(user); + user = fillUnitUnion(user); + + String realm = "platformRealm"; + Object oldPrincipals = activeSession.getAttribute("org.apache.shiro.subject.support.DelegatingSubject.RUN_AS_PRINCIPALS_SESSION_KEY"); + if (oldPrincipals instanceof Collection) { + Collection principals = (Collection) oldPrincipals; + if (!principals.isEmpty() && principals.iterator().next() instanceof PrincipalCollection) { + realm = ((PrincipalCollection) principals.iterator().next()).getRealmNames().iterator().next(); + } + } + List refreshedPrincipals = new CopyOnWriteArrayList<>(); + refreshedPrincipals.add(new SimplePrincipalCollection(user, realm)); + activeSession.setAttribute("org.apache.shiro.subject.support.DefaultSubjectContext.PRINCIPALS_SESSION_KEY", refreshedPrincipals); + activeSession.setAttribute("org.apache.shiro.subject.support.DelegatingSubject.RUN_AS_PRINCIPALS_SESSION_KEY", refreshedPrincipals); } @CacheRemoveAll public void clearCache() { //清除角色缓存 sysRoleService.clearCache(); - -// //获取sessionDao -// DefaultWebSessionManager shiroWebSessionManager = Mvcs.getIoc().get(DefaultWebSessionManager.class, "shiroWebSessionManager"); -// SessionDAO sessionDAO = shiroWebSessionManager.getSessionDAO(); -// Collection activeSessions = sessionDAO.getActiveSessions(); -// -// //获取所有在线的session -// for (Session activeSession : activeSessions) { -// Serializable id = activeSession.getId(); -// Sys_user user = dao().fetch(Sys_user.class, Cnd.where("loginSessionId", "=", id)); -// if (Lang.isEmpty(user)) { -// continue; -// } -// fetchLinks(user, null); -// fillModuleMenus(user); -// fillUnitUnion(user); -// -// //更新subject -// List list = new CopyOnWriteArrayList<>(); -// Subject subject = SecurityUtils.getSubject(); -// PrincipalCollection principals = subject.getPrincipals(); -// String realName = principals.getRealmNames().iterator().next(); -// PrincipalCollection newPrincipalCollection = new SimplePrincipalCollection(user, realName); -// list.add(0, newPrincipalCollection); -// activeSession.setAttribute("org.apache.shiro.subject.support.DelegatingSubject.RUN_AS_PRINCIPALS_SESSION_KEY", list); -// } + flushOnlineUserPermission(); } }