🍒 refactor(auth): 给CreateToken增加 是否刷新 入参,防止刷新token时更新用户登陆状态

This commit is contained in:
喵你个汪呀 2025-08-30 00:00:36 +08:00
parent 888a782127
commit 5a96ecd5ac

View File

@ -221,15 +221,16 @@ public class SysAuthService : IDynamicApiController, ITransient
/// </summary> /// </summary>
/// <param name="user"></param> /// <param name="user"></param>
/// <param name="loginMode"></param> /// <param name="loginMode"></param>
/// <param name="isRefresh"></param>
/// <returns></returns> /// <returns></returns>
[NonAction] [NonAction]
public async Task<LoginOutput> CreateToken(SysUser user, LoginModeEnum loginMode = LoginModeEnum.PC) public async Task<LoginOutput> CreateToken(SysUser user, LoginModeEnum loginMode = LoginModeEnum.PC, bool isRefresh = false)
{ {
// 单用户登录 // 单用户登录
await App.GetRequiredService<SysOnlineUserService>().SingleLogin(user.Id, loginMode); await App.GetRequiredService<SysOnlineUserService>().SingleLogin(user.Id, loginMode);
// 生成Token令牌 // 生成Token令牌
user.TokenVersion += 1; if(!isRefresh) user.TokenVersion += 1;
var tokenExpire = await _sysConfigService.GetTokenExpire(); var tokenExpire = await _sysConfigService.GetTokenExpire();
var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object> var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
{ {
@ -266,24 +267,27 @@ public class SysAuthService : IDynamicApiController, ITransient
// ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']); // ke.global.setAllHeader('Authorization', 'Bearer ' + ke.response.headers['access-token']);
// 更新用户登录信息 // 更新用户登录信息
user.LastLoginIp = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(true); if (!isRefresh)
(user.LastLoginAddress, double? longitude, double? latitude) = CommonHelper.GetIpAddress(user.LastLoginIp);
user.LastLoginTime = DateTime.Now;
user.LastLoginDevice = CommonHelper.GetClientDeviceInfo(_httpContextAccessor.HttpContext?.Request?.Headers?.UserAgent);
await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new
{ {
u.TokenVersion, user.LastLoginIp = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(true);
u.LastLoginIp, (user.LastLoginAddress, double? longitude, double? latitude) = CommonHelper.GetIpAddress(user.LastLoginIp);
u.LastLoginAddress, user.LastLoginTime = DateTime.Now;
u.LastLoginTime, user.LastLoginDevice = CommonHelper.GetClientDeviceInfo(_httpContextAccessor.HttpContext?.Request?.Headers?.UserAgent);
u.LastLoginDevice, await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new
}).ExecuteCommandAsync(); {
u.TokenVersion,
u.LastLoginIp,
u.LastLoginAddress,
u.LastLoginTime,
u.LastLoginDevice,
}).ExecuteCommandAsync();
// 缓存用户Token版本 // 缓存用户Token版本
_sysCacheService.Set($"{CacheConst.KeyUserToken}{user.Id}", $"{user.TokenVersion}"); _sysCacheService.Set($"{CacheConst.KeyUserToken}{user.Id}", $"{user.TokenVersion}");
// 发布系统登录事件 // 发布系统登录事件
await _eventPublisher.PublishAsync(UserEventTypeEnum.Login, user); await _eventPublisher.PublishAsync(UserEventTypeEnum.Login, user);
}
return new LoginOutput return new LoginOutput
{ {
@ -450,6 +454,6 @@ public class SysAuthService : IDynamicApiController, ITransient
public async Task RefreshToken(long userId) public async Task RefreshToken(long userId)
{ {
var user = await _sysUserRep.AsQueryable().IgnoreTenant().Includes(u => u.SysOrg).FirstAsync(u => u.Id == userId); var user = await _sysUserRep.AsQueryable().IgnoreTenant().Includes(u => u.SysOrg).FirstAsync(u => u.Id == userId);
await CreateToken(user, CommonHelper.IsMobile(_httpContextAccessor.HttpContext?.Request.Headers.UserAgent ?? "") ? LoginModeEnum.APP : LoginModeEnum.PC); await CreateToken(user, CommonHelper.IsMobile(_httpContextAccessor.HttpContext?.Request.Headers.UserAgent ?? "") ? LoginModeEnum.APP : LoginModeEnum.PC, true);
} }
} }