asp.net core 拦击器制作的权限管理系统DEMO

效果图

没有登陆不会执行请求日期的方法,不管是否登陆都不允许访问请求时间方法

验证不通过是会进行转发到Home/error方法中,

代码附上:

    [Route("[controller]/[action]")]public class HomeController : BaseController{/// <summary>/// Ajax请求页面/// </summary>/// <param name="username"></param>/// <param name="password"></param>/// <returns></returns>
        [HttpGet]public IActionResult AjaxView(){return View();}/// <summary>/// 登陆接口/// </summary>/// <param name="username"></param>/// <param name="password"></param>/// <returns></returns>
        [HttpGet]public IActionResult Login(){LoginMember();return Json("登陆成功");}/// <summary>/// 清除登陆信息/// </summary>/// <returns></returns>
        [HttpGet]public IActionResult ClearLogin() {ClearMember();return Json("注销成功");}/// <summary>/// 登陆后也不能请求的接口/// </summary>/// <returns></returns>public IActionResult GetNoData(){return Json("时间是" + DateTime.Now.ToLongTimeString());}/// <summary>/// 请求数据接口/// </summary>/// <returns></returns>public IActionResult GetData() {return Json("今天是" + DateTime.Now.ToLongDateString());}/// <summary>/// 请求页面接口/// </summary>/// <returns></returns>public IActionResult GetDataView(){return View();}/// <summary>/// 请求不通过接口/// </summary>/// <returns></returns>public IActionResult Error(){return Json("你没有权限");}}

 

AjaxView视图页:
<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width" /><title>AjaxView</title><script src="https://code.jquery.com/jquery-3.1.1.min.js"></script><script type="text/javascript" >$(function () {$("#Login").click(function () { $.get("/Home/Login", "", function (data) {alert(data);})})$("#ClearLogin").click(function () {$.get("/Home/ClearLogin", "", function (data) {alert(data);})})$("#Getdata").click(function () {$.get("/Home/GetData", "", function (data) {alert(data);})})$("#GetTime").click(function () {$.get("/Home/GetNoData", "", function (data) {alert(data);})})})</script>
</head>
<body><button id="Login">登陆</button><button id="ClearLogin">注销</button><button id="Getdata">请求日期</button><button id="GetTime">请求时间</button>
</body>
</html>
4个请求


支持类(用户类与权限类、枚举):
  /// <summary>/// 用户类/// </summary>public class Member {public string Name { get; set; }//允许请求的连接public IEnumerable<RightsManagement> RightsList { get; set; }}/// <summary>/// 权限类/// </summary>public class RightsManagement {public int ID { get; set; }/// <summary>/// 允许请求的路径/// </summary>public string AllowRequest { get; set; }}public enum ErrorEnum {/// <summary>/// 没有登陆/// </summary>NoLogin=1,/// <summary>/// 不允许访问/// </summary>NoAllow=2,/// <summary>/// 可以访问/// </summary>OK=3}

全局变量

  /// <summary>/// error 方法地址/// </summary>protected string ErrorAction { get; private set; } = "Error";/// <summary>/// error 方法地址/// </summary>protected string ErrorController { get; private set; } = "Home";/// <summary>/// 用户类 ,为了直观点就这样弄了/// </summary>protected static Member member { get; private set; }/// <summary>/// 所有人都能访问的接口,以下接口不会被拦截/// </summary>protected List<RightsManagement> RightsList { get; set; } = new List<RightsManagement>() {new RightsManagement(){ID=3,AllowRequest="Home/Login"},new RightsManagement(){ID=4,AllowRequest="Home/ClearLogin"},new RightsManagement(){ID=5,AllowRequest="Home/Error"},new RightsManagement(){ID=5,AllowRequest="Home/AjaxView"}};private ErrorEnum errorEnum;

 

登陆与注销函数
   /// <summary>/// 登陆函数/// </summary>public void LoginMember() {member = new Member(){Name = "张三",RightsList = new List<RightsManagement>() {new RightsManagement(){ID=1,AllowRequest="Home/GetData"//接口},new RightsManagement(){ID=2,AllowRequest="Home/GetDataView"//视图页}}};}/// <summary>/// 清除登陆信息/// </summary>public void ClearMember() {member = null;}

 

拦截器重写了父类的

OnActionExecutionAsync方法
如果不是asp.net core 将不会有这个方法
OnActionExecuting方法似乎无法决定控制器执行的方法,
   /// <summary>/// 请求开始前异步调用/// </summary>/// <param name="context">参数</param>/// <param name="next">一个已经封装好的委托</param>/// <returns></returns>public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){thecontext = context;//获取请求的路径 并进行拼接string theControllerAndAction = context.ActionDescriptor.RouteValues["controller"] + "/" + context.ActionDescriptor.RouteValues["action"];if (RightsList.Where(d=>d.AllowRequest== theControllerAndAction).Count()>0){//允许默认允许的请求通过return base.OnActionExecutionAsync(context, next);}//定义一个委托 用于表示next下一步执行的方法ActionExecutionDelegate thenext = new ActionExecutionDelegate(TaskOnActionExecutionAsync);if (member == null){//没有登陆errorEnum = ErrorEnum.NoLogin;}else {if (member.RightsList.Where(d => d.AllowRequest == theControllerAndAction).Count() == 0){//没有请求的权利errorEnum = ErrorEnum.NoAllow;}else {errorEnum = ErrorEnum.OK;//用base方法的去处理验证通过的请求,//因为我不知道转发请求的性能是否有额外开销return base.OnActionExecutionAsync(context, next);}}return base.OnActionExecutionAsync(context, thenext);}

 

Task 方法

  Task<ActionExecutedContext> TaskOnActionExecutionAsync() {Task<ActionExecutedContext> thetask = new Task<ActionExecutedContext>(funcOnActionExecutionAsync, thecontext);thetask.Start();return thetask;}
//这是一个全局的临时变量,在控制器中 每次请求都会重置他
  ActionExecutingContext thecontext;
funcOnActionExecutionAsync方法
 ActionExecutedContext funcOnActionExecutionAsync(object o) {ActionExecutingContext theaction = o as ActionExecutingContext;ActionExecutedContext theactionExecutedContext = new ActionExecutedContext(theaction, theaction.Filters, theaction.Controller);//表示跳过控制器方法访问直接返回数据给浏览器,也就是不跳转不进入控制器方法但是有异常信息返回//theaction.Result = Json("请求成功");switch (errorEnum){case ErrorEnum.NoLogin:
            //
theaction.Result =new RedirectResult("/Home/Error");进行重定向
            theaction.Result = RedirectToAction(ErrorAction, ErrorController);
          break;case ErrorEnum.NoAllow:theaction.Result = RedirectToAction(ErrorAction, ErrorController);break;case ErrorEnum.OK:theaction.Result = RedirectToAction(theaction.ActionDescriptor.RouteValues["action"], theaction.ActionDescriptor.RouteValues["controller"]);break;default:break;}return theactionExecutedContext;}

 


OK 以上就是全部代码



其中可访问链接我是用list保存,也不知道有没有更好的方法。

Over





 

转载于:https://www.cnblogs.com/AnAng/p/8657447.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工程师姓什么很重要!别再叫我“X工”!!!

工程师之间都是这么互相打招呼的——“高工&#xff0c;你设计图通过了么&#xff1f;”“李工&#xff0c;工程画完了吗&#xff1f;”“王工&#xff0c;你真是越来越漂亮了&#xff01;”"张工&#xff0c;你的DFM整完了吗"“周公&#xff0c;Schedule 该更新了”…

说一下NFC,手机有NFC功能却不能模拟门禁卡?

img1、NFC是什么&#xff1f;NFC&#xff08;Near Field Communication&#xff09; 技术由Philips、Nokia和Sony主推的一种近距离无线通信技术&#xff08;NFCIP-1&#xff09;&#xff0c;是一种短距离非接触式的通信方式&#xff0c;通常有效通讯距离为4厘米以内。工作频率为…

小程序员的大梦想 与盖茨像哥们儿

小程序员的大梦想 与盖茨像哥们儿以10亿的天价转会新华都&#xff0c;让唐骏有机会开创其职业经理人生涯的新局面&#xff0c;但在此之前&#xff0c;他的成功已得到证明面前的唐骏温和得令人吃惊。仿佛“前微软中国区总裁”、“打工皇帝”、“10亿转会身价”这样的光环带给他的…

动态规划详解

个人见解&#xff1a;1.动态规划实现了把问题拆分成多个子问题&#xff0c;然后求解&#xff0c;子问题有解后&#xff0c;问题自然迎刃而解&#xff1b;2.动态规划实现了子问题的状态的迁移&#xff0c;保存每个状态值&#xff0c;递推出答案&#xff0c;但不记录每种状态的求…

我的奶奶

突然想起我奶奶&#xff0c;是突然发现&#xff0c;距离奶奶去世已经有快十年&#xff0c;这十年时间&#xff0c;我也再也没有见过奶奶。奶奶刚去世的前几年&#xff0c;有时候会梦到奶奶跟我说话&#xff0c;她总是会很耐心的告诉我很多道理。奶奶从小到大都没有指责过我&…

WPF应用程序内存泄漏的一些原因

原文&#xff1a;Finding Memory Leaks in WPF-based applications There are numbers of blogs that folks wrote about memory leaks in Microsoft .Net Framework managed code and unmanaged code based applications. In this blog I wanted to: Show coding practices th…

[转]Eclipse RCP应用系统开发方法与实战2-- 定制应用程序窗口属性

5.1.4 定制应用程序窗口属性 向导生成的应用程序主界面并不能满足要求&#xff0c;存在很多问题&#xff0c;例如&#xff0c;主界面运行时没有自动居中&#xff0c;主界面大小没有固 定&#xff0c;主窗口标题栏文字应该是“高校经费测算系统”。再看看图5-3、图5-4的标题栏有…

赢在中国 - 史玉柱经典语录

1.要重视建立销售手册2.凡是先做试点&#xff0c;风险才低。3.找到自己的细分市场。4.不要总想着同竞争对手对立&#xff0c;而是要想办法让自己弥补竞争对手的不足。5. 如果没有价格上的优势与技术上的绝对优势&#xff0c;千万不要进入红海市场&#xff0c;否则你会必输无疑&…

我最近在学微信小程序开发,一起吗?

从当初的一夜成名&#xff0c;到今天火爆的市场占有率&#xff0c;微信小程序已走过 4 个年头。据今年 1 月阿拉丁发布的报告显示&#xff0c;微信小程序 2020 年 DAU 已破 4 亿&#xff0c;其总数超 380 万。最近有读者问我说&#xff0c;发哥&#xff0c;之前自己一直是个人…

WebService大讲堂之Axis2(2):复合类型数据的传递

在实际的应用中&#xff0c;不仅需要使用WebService来传递简单类型的数据&#xff0c;有时也需要传递更复杂的数据&#xff0c;这些数据可以被称为复合类型的数据。数组与类&#xff08;接口&#xff09;是比较常用的复合类型。在Axis2中可以直接使用将WebService方法的参数或返…

Linux虚拟摄像头vivid配置

总述最近在看摄像头驱动&#xff0c;需要配置虚拟摄像头的驱动&#xff0c;但是教程里面是linux2.6内核的&#xff0c;实际电脑的是Ubuntu16&#xff0c;内核是linux4.15版本&#xff0c;从2.6到4.15内核好多文件发生了变化&#xff0c;所以我们该怎么操作呢&#xff1f;下面就…

第一次工作报告

要求 1. 对源文件&#xff08;*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等&#xff09;统计字符数、单词数、行数、词频&#xff0c;统计结果以指定格式输出到默认文件中&#xff0c;以及其他扩展功能&#xff0c;并能够快速地处理多个文件。 2. 使用性能…

树莓派Pico的一些有趣的基本实验

▲ 实验电路板Raspberry PI Pico小型MCU模块&#xff0c;以其价格低廉&#xff0c;功能丰富&#xff0c;开发方便为很多非电子类专业的同学进行创意项目原型设计提供了方便的平台。下面的一些实验给CDIE课程设计同学们制作的一些基本演示实验。▌01 PI Pico实验板在 RASPBERRY …

Gabor变换

gabor变换分析非平稳信号有弊端主要是时频窗宽度固定 小波wavelet a小窗窄a大窗宽 窗口或短时傅氏变换在时域上和频域上的局部化程度主要由窗函数g(x)的有效时宽Δt 和有效带宽Δf 决定。Δt 和Δf 越小, 表明局部性越好。但Heisenberg 测不准原理指出[ 6] :Δt 和Δf 不可能任…

30块钱的树莓派跑unix系统,源码全部开源,香

▌ 1、前言之前做活动抽奖送的几个树莓派&#xff0c;但是因为好几个人都没有填写地址&#xff0c;所以就只能把东西寄回来给我&#xff0c;然后手痒自己玩了下&#xff0c;觉得这个东西确实很香&#xff0c;比一般的Linux开发板都好。PICO这个开发板可以玩很多东西1 、运行pic…

为什么大家都只谈薪资,却不谈梦想?

说个薪资的问题&#xff0c;最近在帮一个朋友物色工作&#xff0c;当然&#xff0c;除了我那个朋友以外&#xff0c;也有挺多同学向我咨询offer薪资的问题。先说我那个朋友。高中毕业后去当兵&#xff0c;服兵役结束后去4s店修车&#xff0c;我车子的很多问题也会向他咨询&…

差生的 8 年程序员总结

今年终于从大菊花厂离职了&#xff0c;离职前收入大概60w不到吧&#xff0c;在某乎属于比较差的&#xff0c;今天终于有空写一下自己的职场故事&#xff0c;也算是给自己近8年的程序员工作做个总结复盘。近8年有些事情做对了&#xff0c;也有更多事情做错了&#xff0c;在这里记…

Python简单的抓取静态网页内容

import requests from bs4 import BeautifulSoup res requests.get(http://news.sina.com.cn/china/)#获取目标网页 res.encoding utf-8#抓取网页出现乱码 #print(res.text) soup BeautifulSoup(res.text,html.parser)#爬取网页 for news in soup.select(.news-item): if le…

直观感受电路信号波形:半波整流电路

前言电子电路的理论很抽象&#xff0c;所以多看电子电路的信号波形&#xff0c;对掌握理论知识非常有帮助。让我们通过形象的电路信号波形&#xff0c;直观地了解电路的世界&#xff01;半波整流电路半波整流电路&#xff0c;电路图很简单&#xff0c;通过一个二极管实现半波整…