1-背景介绍
需要做一个简单权限系统,基于 角色,用户,菜单 的模式
基于IActionFilter全局拦截,在内部跳转或者浏览器跳转的时候,拦截是成功的,当通过AJAX 请求的时候,页面就不会跳转
2-登录后初始化该用户权限到redis 缓存
因为菜单没有设置失效机制,所以登录就刷新菜单缓存数据
3- 基于 IActionFilter 全局过滤
在OnActionExecuting 方法 用判断 改动作是否有权限,没有的话就跳转一个 拒绝访问的友好页面。
首先,我们需要判断是否是AJAX 请求,如果是的话,返回你的 正常的处理AJAX请求的返回JSON串 就可以了,前端就可以直接拿到然后做出正确的动作
如果不是则直接跳转无权限 访问 的页面
4- 代码及效果展示
1 public void OnActionExecuting(ActionExecutingContext context) 2 { 3 var hasPermission = true; 4 //权限拦截 5 if (context.HttpContext.User.Identity.IsAuthenticated) 6 { 7 var identity = context.HttpContext.User as ClaimsPrincipal; 8 var accountId = identity.Claims.First(x => x.Type == ClaimTypes.NameIdentifier).Value; 9 var accountName = identity.Claims.First(x => x.Type == ClaimTypes.Name).Value; 10 if (accountName != "admin") 11 { 12 var menuDatalist = _menuMudoleStore.GetSysmodules(Convert.ToInt32(accountId), accountName, openRedis: true); 13 var currentUrl = context.HttpContext.Request.Path.ToString().ToLower(); 14 if (currentUrl != "/Account/AccessDenied".ToLower()) 15 { 16 if (menuDatalist == null && menuDatalist.Count <= 0) 17 { 18 hasPermission = false; 19 } 20 else 21 { 22 var mtypeid = (int)SysModuleType.module; 23 var pageList = menuDatalist.Where(x => x.moduletypeid != mtypeid).ToList(); 24 if (!pageList.Any(x => x.url.ToLower() == currentUrl)) 25 { 26 hasPermission = false; 27 } 28 } 29 } 30 } 31 } 32 if (!hasPermission) 33 { 34 if (context.HttpContext.Request.IsAjax()) 35 { 36 context.Result = new JsonResult(new ReturnResult<string> 37 { 38 success = false, 39 status = 302, 40 message = "您无权限访问", 41 data= "/Account/AccessDenied" 42 }); 43 } 44 else 45 context.HttpContext.Response.Redirect("/Account/AccessDenied"); 46 } 47 }