背景:
当前身份缓存对象顾名思义就是:当前登录的用户身份对象,那它解决了什么问题呢?其实在我们日常开发过程中经常能用的到几乎是必备的,就比如我给某个表插入数据时需要创建人或者一些权限的访问,都得用到当前身份缓存对象,当然啦今天的博客就是因为我们公司研发部门刚成立不久所以导致很多项目不完善,我在开发过程中就遇到了没有当前身份缓存对象的问题,开发极其不方便啊哈哈,所以我打算自己整一个,所以就有了今天的这篇文章,希望在对屏幕前的你也有所帮助!!
思路:
我们登录后一些必要的用户数据存到Token中,我们只需要在请求头中拿到Token并将它解析出来,再通过数据库查询出来即可,做的好一点可以配合上Redis,但是不用Redis也无伤大雅,当然也会遇到一些小问题,比如HttpContext对象如何获取,我在这里的解决方案是,定义一个静态类然后在请求管道中拿到服务容器,再通过服务容器拿到IHttpContextAccessor服务,再点出HttpContext,再拿到请求头,是不是很简单,那我们就直接步入正题吧!!!各位看官献丑了哈哈哈哈
正题:
1.创建静态类ServiceLocator获取服务容器:
在这里解释一下为什么不直接注入IHttpContextAccessor服务再通过构造函数获取,因为这过程中会有遇到一个问题,在静态类中是不能有构造函数的,如果是直接把这个服务容器拿过来就可以完美的解决这个问题,先不着急在下面会体现(第三和第五点)
1 public static class ServiceLocator 2 { 3 public static IApplicationBuilder? Builder; 4 }
2.在请求管道中赋值
1 var app = builder.Build(); 2 ServiceLocator.Builder = app;
3.创建HttpContext类并通过IHttpContextAccessor服务获取HttpContext
1 /// <summary> 2 /// Http上下文对象 3 /// </summary> 4 public static HttpContext HttpContext => ServiceLocator.Builder! 5 .ApplicationServices 6 .GetRequiredService<IHttpContextAccessor>() 7 .HttpContext;
4.创建Jwt帮助类,代码如下:
1 public static class JwtHelper 2 { 3 /// <summary> 4 /// 解密Token成字典 5 /// </summary> 6 /// <returns></returns> 7 public static Dictionary<string, string> GetTokenValue(string token) 8 { 9 var st = new JwtSecurityTokenHandler().ReadJwtToken(token); 10 var claims = st.Claims.ToList(); 11 var res = new Dictionary<string, string>(); 12 claims.ForEach(d => 13 { 14 res.Add(d.Type, d.Value); 15 }); 16 return res; 17 } 18 19 }
5.创建当前身份缓存对象帮助类并将Token中信息解析,并查询响应
1 public static class CurUserInfoHelper 2 { 3 /// <summary> 4 /// 当前身份缓存对象 5 /// </summary> 6 public static SysUserOutputWebDto? CurUserInfo => GetCurUserInfo(); 7 8 /// <summary> 9 /// 获取当前用户身份缓存对象 10 /// </summary> 11 /// <returns></returns> 12 public static SysUserOutputWebDto GetCurUserInfo() 13 { 14 var result = new SysUserOutputWebDto(); 15 var httpContext = HttpContextHelper.HttpContext; 16 var headrs = httpContext.Request.Headers; 17 var authorization = headrs["Authorization"]; 18 string token = authorization!; 19 if (token.Contains("Bearer")) 20 { 21 string[] tokenStr = authorization.ToString().Split(' '); 22 token = tokenStr[1]; 23 }
//解密 24 var claims = JwtHelper.GetTokenValue(token); 25 var userId = claims["UserID"]; 26 if (!string.IsNullOrEmpty(userId)) 27 { 28 //非构造函数式注入服务 29 var serviceScope = ServiceLocator.Builder!.ApplicationServices.CreateScope(); 30 var sysUserEntityBL = serviceScope.ServiceProvider.GetService(typeof(ISysUserEntityBL)) as ISysUserEntityBL; 31 32 var sysUser = sysUserEntityBL!.GetSinge(d => d.Id == userId); 33 result = sysUser.AsOutputWebDto();//Entity转换为输出型Dto 34 } 35 return result; 36 } 37 38 }
6.直接使用即可
1 var curUser =CurUserInfoHelper.CurUserInfo;
效果如下图:
结尾:
今天的内容承接上篇Jwt加密篇,如果过程中有不清楚或者中断的地方可以回顾下上篇文章,也欢迎私信请教,或者在评论区探讨,本人还是个初入职场的小白如有不足的地方也希望大佬们能及时指出,好啦今天的内容就到这里了哦,如果对你有帮助就点个攒支持一下吧嘻嘻