From bfc88b44b2aec3e4ac42aa2f20816c222ef75831 Mon Sep 17 00:00:00 2001 From: FunCoder Date: Mon, 7 Apr 2025 09:54:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A4=E7=89=8C=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=9B=B4=E6=96=B0=E6=9C=BA=E5=88=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Service/Auth/SysAuthService.cs | 4 +-- .../Service/User/SysUserService.cs | 26 ++++++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs index 2cc2642f..de12be24 100644 --- a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs +++ b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs @@ -352,8 +352,8 @@ public class SysAuthService : IDynamicApiController, ITransient // .Where(u => u.Id == _userManager.UserId) // .ExecuteCommandAsync(); - // 更新用户Token版本缓存 - _sysCacheService.Set($"{CacheConst.KeyUserToken}{_userManager.UserId}", $"{_userManager.TokenVersion + 1}"); + //// 更新用户Token版本缓存 退出系统不用更新系统缓存,更新后其他已登录机全都要重新登录。 + //_sysCacheService.Set($"{CacheConst.KeyUserToken}{_userManager.UserId}", $"{_userManager.TokenVersion + 1}"); // 发布系统退出事件 await _eventPublisher.PublishAsync(UserEventTypeEnum.Logout, _userManager); diff --git a/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs b/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs index 7c219835..28d290fa 100644 --- a/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs +++ b/Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs @@ -4,6 +4,8 @@ // // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! +using System.Linq; + namespace Admin.NET.Core.Service; /// @@ -140,7 +142,8 @@ public class SysUserService : IDynamicApiController, ITransient if (await query.AnyAsync(u => u.Account == input.Account)) throw Oops.Oh(ErrorCodeEnum.D1003); if (!string.IsNullOrWhiteSpace(input.Phone) && await query.AnyAsync(u => u.Phone == input.Phone)) throw Oops.Oh(ErrorCodeEnum.D1032); - input.TokenVersion++; + ////更新用户普通信息时不因更新TokenVersion + //input.TokenVersion++; var user = input.Adapt(); await _sysUserRep.AsUpdateable(user).IgnoreColumns(true).IgnoreColumns(u => new { u.Password, u.Status, u.TenantId }).ExecuteCommandAsync(); @@ -287,13 +290,16 @@ public class SysUserService : IDynamicApiController, ITransient { var user = await _sysUserRep.GetByIdAsync(input.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009); - await _sysUserRoleService.GrantUserRole(input); - - // 强制下线账号和失效Token - await OfflineAndExpireToken(user); - - // 发布更新用户角色事件 - await _eventPublisher.PublishAsync(UserEventTypeEnum.UpdateRole, input); + // 若账号的角色发生变化,才更新 + var roles = await _sysUserRoleService.GetUserRoleIdList(input.UserId); + if(!roles.SequenceEqual(input.RoleIdList)) + { + await _sysUserRoleService.GrantUserRole(input); + // 强制下线账号和失效Token + await OfflineAndExpireToken(user); + // 发布更新用户角色事件 + await _eventPublisher.PublishAsync(UserEventTypeEnum.UpdateRole, input); + } } /// @@ -461,8 +467,8 @@ public class SysUserService : IDynamicApiController, ITransient /// private async Task OfflineAndExpireToken(SysUser user) { - // 更新Token版本缓存 - _sysCacheService.Set($"{CacheConst.KeyUserToken}{user.Id}", $"{user.TokenVersion + 1}"); + // 更新Token版本缓存,当角色、机构、密码、重置、删除、状态改变时,Token版本清0 + _sysCacheService.Remove($"{CacheConst.KeyUserToken}{user.Id}"); // 强制下线账号 await _sysOnlineUserService.ForceOfflineByUserId(user.Id);