// // // using ERP.Framework.Cache; using ERP.Framework.Config; using ERP.Framework.Constants; using ERP.Framework.Emum; using ERP.Framework.Exceptions; using ERP.Framework.Resource; using ERP.Framework.Security.Core; using ERP.Framework.Utils; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; namespace ERP.Framework.Security { public class LoginHelper { /// /// 根据设备进行登录 /// /// /// /// /// /// public static string LoginByDevice( LoginUser userInfo , SecurityConfig securityConfig , DeviceEnum device) { string tokenId; var tokenList = GetTokenList(userInfo.UserId); var result = TokenHelper.CreateToken( securityConfig.JwtSecurityKey , userInfo.UserId , userInfo.UserName , securityConfig.TimeOut , out tokenId); //Todo 不允许并发登录处理 HandleExceedToken(tokenList, securityConfig); tokenList.Add(new TokenSign { TokenId = tokenId, Device = device }); SetTokenList(userInfo.UserId, tokenList); SetLastActivity(tokenId, securityConfig.ActivityTimeOut, securityConfig.TimeOut); SetUserInfo(tokenId, userInfo, securityConfig.TimeOut); return result; } /// /// 获取当前用户 /// /// /// public static LoginUser GetLoginUser() { var httpContextAccessor = new HttpContextAccessor(); var httpContext = httpContextAccessor.HttpContext; var loginUser = httpContext!.Items["LoginUser"] as LoginUser; if (loginUser != null) { return loginUser; } var tokenId = httpContext!.Items["TokenId"] as string; var redisData = RedisHelper.Get(AuthConstant.USER_INFO + tokenId); var result = JsonConvert.DeserializeObject(redisData); if (result != null) { httpContext.Items["LoginUser"] = result; return result; } else { throw new CodeException(message: FrameworkI18N.NoUser, code: ErrorCode.NO_USER); } } /// /// 获取当前用户Id /// /// public static long GetUserId() { var httpContextAccessor = new HttpContextAccessor(); var httpContext = httpContextAccessor.HttpContext; var result = httpContext!.Items["UserId"] as string; return result!.ToLong()!.Value; } public static bool IsAdmin() { var httpContextAccessor = new HttpContextAccessor(); var httpContext = httpContextAccessor.HttpContext; var userName = httpContext!.Items["UserName"] as string; return userName == FrameworkConstant.ADMIN; } /// /// 获取TokenList缓存 /// /// /// private static List GetTokenList(long userId) { var tokenListData = RedisHelper.Get(AuthConstant.TOKEN_LIST + CryptoUtil.MD5(userId.ToString())); if (!tokenListData.IsNullOrEmpty()) { var data = JsonConvert.DeserializeObject>(tokenListData)!; return data; } return new List(); } /// /// 创建Last Activity /// /// /// private static void SetLastActivity(string tokenId, int activityTimeOut, int tokenTimeOut) { var key = AuthConstant.LAST_ACTIVITY + tokenId; var val = DateTime.Now.AddMinutes(activityTimeOut).ToDateLongString(); RedisHelper.SaveExpire(key, val, tokenTimeOut); } /// /// 处理超出的会话 /// /// /// private static void HandleExceedToken(List list, SecurityConfig config) { if (list.Count > config.MaxLoginCount) { var num = list.Count - config.MaxLoginCount; var substituteList = list.Take(num).ToList(); foreach (var item in substituteList) { SubstitutedUser(item.TokenId, config.TimeOut); } list.RemoveRange(0, num); } } /// /// 顶下用户 /// /// /// private static void SubstitutedUser(string tokenId, int tokenTimeOut) { var key = AuthConstant.LAST_ACTIVITY + tokenId; RedisHelper.SaveExpire(key, AuthConstant.SUBSTITUTED, tokenTimeOut); } /// /// 创建Token List缓存 /// /// /// private static void SetTokenList(long userId, List list) { var key = AuthConstant.TOKEN_LIST + CryptoUtil.MD5(userId.ToString()); var val = JsonConvert.SerializeObject(list); RedisHelper.Save(key, val); } /// /// 创建UserInfo /// /// /// private static void SetUserInfo(string tokenId, LoginUser loginUser, int tokenTimeOut) { var key = AuthConstant.USER_INFO + tokenId; var val = JsonConvert.SerializeObject(loginUser); RedisHelper.SaveExpire(key, val, tokenTimeOut); } } }