1-背景介绍

需要做一个简单权限系统,基于 角色,用户,菜单 的模式

基于IActionFilter全局拦截,在内部跳转或者浏览器跳转的时候,拦截是成功的,当通过AJAX 请求的时候,页面就不会跳转

2-登录后初始化该用户权限到redis 缓存

因为菜单没有设置失效机制,所以登录就刷新菜单缓存数据

3- 基于 IActionFilter 全局过滤

在OnActionExecuting 方法 用判断 改动作是否有权限,没有的话就跳转一个 拒绝访问的友好页面。

首先,我们需要判断是否是AJAX 请求,如果是的话,返回你的 正常的处理AJAX请求的返回JSON串 就可以了,前端就可以直接拿到然后做出正确的动作

如果不是则直接跳转无权限 访问 的页面

4- 代码及效果展示

 public void OnActionExecuting(ActionExecutingContext context)
{
var hasPermission = true;
//权限拦截
if (context.HttpContext.User.Identity.IsAuthenticated)
{
var identity = context.HttpContext.User as ClaimsPrincipal;
var accountId = identity.Claims.First(x => x.Type == ClaimTypes.NameIdentifier).Value;
var accountName = identity.Claims.First(x => x.Type == ClaimTypes.Name).Value;
if (accountName != "admin")
{
var menuDatalist = _menuMudoleStore.GetSysmodules(Convert.ToInt32(accountId), accountName, openRedis: true);
var currentUrl = context.HttpContext.Request.Path.ToString().ToLower();
if (currentUrl != "/Account/AccessDenied".ToLower())
{
if (menuDatalist == null && menuDatalist.Count <= )
{
hasPermission = false;
}
else
{
var mtypeid = (int)SysModuleType.module;
var pageList = menuDatalist.Where(x => x.moduletypeid != mtypeid).ToList();
if (!pageList.Any(x => x.url.ToLower() == currentUrl))
{
hasPermission = false;
}
}
}
}
}
if (!hasPermission)
{
if (context.HttpContext.Request.IsAjax())
{
context.Result = new JsonResult(new ReturnResult<string>
{
success = false,
status = ,
message = "您无权限访问",
data= "/Account/AccessDenied"
});
}
else
context.HttpContext.Response.Redirect("/Account/AccessDenied");
}
}

后台代码 GlobalActionFilter

 //初始化树
function initTree(roleid) {
$.ajax({
url: '/Role/GetMenuTree',
type: 'get',
data: {
roleid: roleid
},
success: function (result) {
console.log(result)
if (result.success) {
zTreeObj = $.fn.zTree.init($("#permissiontree"), setting, result.data);
//
toastr.info('数据加载成功', '提示');
} else {
toastr.error(result.message, '警告');
//权限拦截
if (result.status == ) {
$('#authperssionsformmodal').modal('hide');
//setTimeout(function () {
// window.location.href = result.data;
//}, 500);
}
}
$('#dvloading').modal('hide');
},
beforeSend: function () {
// Handle the beforeSend event
$("#dvloading").modal({ backdrop: 'static', keyboard: false });
},
complete: function (xhr) {
// Handle the complete event
$('#dvloading').modal('hide'); },
error: function (e) {
$('#dvloading').modal('hide');
toastr.error('系统错误,请重试', '警告');
window.clearInterval(timer);
}
});
}

前端代码

最新文章

  1. HTTP的长连接和短连接
  2. Zabbix监控nginx-rtmp status(html版)
  3. Kernel Methods (1) 从简单的例子开始
  4. Android EditText组件drawableLeft属性设置的图片和hint设置的文字之间的距离
  5. 中兴手机关闭3G网络
  6. python数字图像处理(5):图像的绘制
  7. ViewConfiguration.getScaledTouchSlop () 用法
  8. MATLAB信号与系统分析(四)&mdash;&mdash;离散信号与系统的复频域分析及MATLAB实现
  9. 1503 - A PRIMARY KEY must include all columns in the table&#39;s partitioning function
  10. 华为OJ平台——字符串匹配
  11. 在android market发布个人免费应用的步骤
  12. HTML\Script 去除关键字
  13. Google map v3 using simple tool file google.map.util.js v 1.1
  14. socketlog的安装和使用
  15. Scrum【转】
  16. 一篇文章搞定SpringMVC参数绑定
  17. 接触Java23天
  18. [luogu3391][文艺平衡树]
  19. vue 常用手册
  20. Vue + Element UI 实现权限管理系统(动态加载菜单)

热门文章

  1. JavaScript碎片———函数闭包(模拟面向对象)
  2. 大数据:spark集群搭建
  3. Python学习 :多线程 --- 锁
  4. upload-labs19记录
  5. C++ —— 类中static和const关键字声明变量的初始化方式总结
  6. Go语言反射之类型反射
  7. Oracle入门第五天(下)——数据库其他对象
  8. 20155315 2016-2017-2 《Java程序设计》第二周学习总结
  9. 我与虚拟机的初次接触及初探Liux命令 20155338
  10. 20155339 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile以及myod