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,一经查实,立即删除!

相关文章

WritePrivateProfileString等读写.ini配置文件

https://blog.csdn.net/wuguai4/article/details/7287346

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

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

Eclipse快捷键大全(转载)

Ctrl1 快速修复(最经典的快捷键,就不用多说了)CtrlD: 删除当前行 CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt↑ 当前行和上面一行交互位置(同上)Alt← 前一个编辑的页…

STM32F103按键操作的另一种实现——状态机

#ifndef _KEY_H_ #define _KEY_H_#include "HAL_gpio.h" // 换成STM32F103对应的GPIO库 #include "type.h" // type.h主要是一些类型的重命名#define KEY_UP_GRP GPIOA #define KEY_UP_IDX GPIO_Pin_9 #define KEY_UP_IS_DOWN() GPI…

二分法的应用:POJ1064 Cable master

/* POJ1064 Cable master时间限制&#xff1a; 1000MS 内存限制&#xff1a; 10000K 提交总数&#xff1a; 58217 接受&#xff1a; 12146 描述Wonderland的居民已经决定举办地区性编程比赛。评委会自愿并承诺举办有史以来最诚实的比赛。决定使用“星形”拓扑结构…

说一下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;距离奶奶去世已经有快十年&#xff0c;这十年时间&#xff0c;我也再也没有见过奶奶。奶奶刚去世的前几年&#xff0c;有时候会梦到奶奶跟我说话&#xff0c;她总是会很耐心的告诉我很多道理。奶奶从小到大都没有指责过我&…

CPtrArray、CObArray类

CPtrArray https://baike.baidu.com/item/CPtrArray CObArray类 https://baike.baidu.com/item/CObArray CPtrArray类支持void指针数组。CPtrArray的成员函数类似于CObArray类的成员函数。 外文名 CPtrArray 支 持 void指针数组 成员函数 CObArray类的成员函数 操作符 …

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的标题栏有…

bootloader启动流程分析

bootloader启动流程分析 1、Bootloader的概念和作用 Bootloader是嵌入式系统的引导加载程序&#xff0c;它是系统上电后运行的第一段程序。在完成对系统的初始化任务之后&#xff0c;它会将Flash中的Linux内核拷贝到 RAM 中去&#xff0c;跳转到内核的第一条指令处继续执行&…

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

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

Utility.cpp的函数

C 对文件夹的安全权限操作 https://blog.csdn.net/zipper9527/article/details/6256459 https://blog.csdn.net/sz76211822/article/details/73199181 ZeroMemory https://baike.baidu.com/item/ZeroMemory/961326?fraladdin GetComputerName https://baike.baidu.com/item/G…

类中调用界面ActiveX控件报错当前线程不在单线程单元中因此无法实例化 ActiveX 控件的解决办法...

解决办法是Form类中定义一个静态的ActiveX对象,在formload中将界面上的ActiveX对象赋值给新定义的对象,类中访问该静态对象即可. public static AxClientDriver_NTLib.AxClientDriverCtrl com new AxClientDriver_NTLib.AxClientDriverCtrl(); private void Form1_Load(object…

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

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

回数

回数是指从左到右读和从右到左读都是一样的数&#xff0c;请利用filter()滤掉非回数(打印出1000内所有回数) def is_palindrome(n): return str(n)str(n)[::-1] # str(n)[::-1]代表字符串从后往前读&#xff0c;也代表字符串的翻转 output filter(is_palindrome,range(1,10…

初始化COM库

初始化COM库 CoCreateInstance //在本机中只创建一个对象 https://baike.baidu.com/item/CoCreateInstance QueryInterface 客户可以通过此函数来查询某个组件是否支持某个特定的接口 https://baike.baidu.com/item/QueryInterface SetNotifyWindow //注册一个窗口来处理事件通…