利用mvc filterconfig属性实现权限验证
好久没写过博客了,突然发现最后博客更新时间是2016年,感觉好长远
权限控制基本是所有cms系统或者进销存,或者几乎所有能和业务系统扯上关系的系统都要用上的一个模块,很多都想把这个模块独立出来,权限单独统一控制,所以就出现了aop及其他相关技术操作,当然我这里说aop只是说了aop的一种功能
我今天说的是mvc自带的过滤属性就可以实现这些操作
1.前端还是需要准备一些权限信息 权限code可以是系统内部的所有页面网址,当然还有一些通用权限,如增删改审批等
2.为页面权限配置操作权限比如某个页面只有修改权限没有删除审批权限
3.下面就需要上代码了,所有controller继承一个basecontroller,在basecontroller中可以初始化一些上下文信息或定义一些通用方法,basecontroller需要一个初始化验证属性,在这个初始化属性中就可以写我们的权限控制
[MvcInitContextFilter]
public class BaseController : Controller
public class MvcInitContextFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true))
{
return;
}
var controller = filterContext.Controller as BaseController;
if (controller == null)
{
return;
}
if (filterContext.IsChildAction)
{
controller.UserContext = UserContext.Current;
return;
}
#region 写入usercontext
//dynamic user = controller.Session[StaticString.CookieLoginInfo];
controller.UserContext = UserContext.Instanse();
UserContext.Current = controller.UserContext; controller.InitContexts();
#endregion #region 方法权限过滤
var action = filterContext.RouteData.Values["action"].ToString();
//string url = filterContext.HttpContext.Request.Url.LocalPath.ToString(); var paras = filterContext.ActionParameters as Dictionary<string, object>; //ajax方法过滤
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
List<string> ajaxActionList = new List<string>();
ajaxActionList.Add("save");
ajaxActionList.Add("list");
ajaxActionList.Add("setpost");
ajaxActionList.Add("del");
ajaxActionList.Add("delmore");
if (ajaxActionList.Any(o => action.ToLower().Contains(o)))
{
BaseRequest request = null; string Code = "";
int MenuAuthId = ;
Code = controller.Request.Params["Code"];
string MenuAuthIdStr = controller.Request.Params["MenuAuthId"];
if (string.IsNullOrEmpty(MenuAuthIdStr))
{
MenuAuthIdStr = paras.Keys.Contains("MenuAuthId") ?paras["MenuAuthId"].ToString():null;
}
if (Code==null)
{
Code = paras.Keys.Contains("Code") ? paras["Code"].ToString():null;
}
if (MenuAuthIdStr!=null){ int.TryParse(MenuAuthIdStr,out MenuAuthId); }
if ((!string.IsNullOrWhiteSpace(Code)) && MenuAuthId>)
{
request = new BaseRequest();
request.Code = Code;
request.MenuAuthId =MenuAuthId ;
}
else if (paras != null && paras.Count > )
{
KeyValuePair<string, object> pair = paras.First();
request = pair.Value as BaseRequest;
} if (MenuAuthId>&&!string.IsNullOrEmpty(Code))
{ }
else
{
//如果没有继承baserequest类就不做检查了
if (request == null)
{
return;
}
}
try
{ List<OperateAuth> operateAuths1 = CRoleAuthDAL.GetMenuAuths(controller.UserContext.CurrentUser.UserID, request.MenuAuthId);
if (string.IsNullOrEmpty(request.Code) || operateAuths1 == null ||
(!operateAuths1.Any(auth => auth.AuthCode.ToLower().Equals(request.Code.ToLower()))))
{
filterContext.HttpContext.Response.Write("您没有权限访问此页面");
filterContext.HttpContext.Response.End();
}
}
catch (Exception)
{ }
} } //action方法过滤
else
{
var menuAuthIdStr = controller.Request.QueryString["menuAuthId"];
if (!string.IsNullOrEmpty(menuAuthIdStr))
{
var menuAuthId = ;
if (menuAuthIdStr.Contains(","))
{
menuAuthIdStr = menuAuthIdStr.Split(',')[];
}
menuAuthId = int.Parse(menuAuthIdStr);
controller.ViewData["auth"] = CRoleAuthDAL.GetMenuAuths(controller.UserContext.CurrentUser.UserID, menuAuthId);
controller.ViewData["menuAuthId"] = menuAuthIdStr;
}
}
}
#endregion
}
这里面只是为了实现我自己的需求多加了一些东西,可以满足自己需求上做修改
这个MenuAuthId 是指页面权限id,对应code是前台request或者ajax里面传递的是否有这个权限然后继续下去的通用权限,如增删改
对于页面,这里还可以根据页面权限id或者页面url从数据库中查出,当前页面所能拥有的权限,然后通过viewdata的方式传递给页面,方便页面相关按钮的显示隐藏
此处做的MenuAuthId 可以用页面的url代替,这样更通用,更简单,稍作修改即可
如有建议或意见可以加群223026227
利用mvc filterconfig属性实现权限验证的更多相关文章
- MVC 自定义AuthorizeAttribute 实现权限验证
MVC内置的AuthorizeFilter先于Action/Result过滤器执行,为网站权限验证提供了很好的一套验证机制. 通过自定义的AuthorizeAttribute可以实现对用户权限的验证. ...
- MVC权限验证过滤器
Action属性,权限设定属性 [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)] ...
- 关于filter web api mvc 权限验证 这里说的够详细了。。。
参考:http://www.cnblogs.com/willick/p/3331520.html Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外 ...
- 【3】.net MVC 使用IPrincipal进行Form登录即权限验证
1.在MVC项目中添加用户类,可以根据实际项目需求添加必要属性 public class UserData { /// <summary> /// ID /// </summary& ...
- ASP.NET MVC权限验证 封装类
写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一个全局过滤器 //受权过滤器 publi ...
- Spring MVC 使用拦截器优雅地实现权限验证功能
在上一篇 SpringAOP 实现功能权限校验功能 中虽然用AOP通过抛异常,请求转发等勉强地实现了权限验证功能,但感觉不是那么完美,应该用拦截器来实现才是最佳的,因为拦截器就是用来拦截请求的,在请求 ...
- NET MVC权限验证
ASP.NET MVC权限验证 封装类 写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一 ...
- C# MVC权限验证
前言 之前一直没怎么接触过权限验证这块,刚好公司老平台改版,就有了这篇权限验证.此篇文章大致讲解下 精确到按钮级别的验证如何实现.以及权限验证设计的参考思路(菜鸟一枚,大神勿喷). 在开发大项目的时候 ...
- Web用户的身份验证及WebApi权限验证流程的设计和实现 asp.net mvc AllowAnonymous 不起作用, asp.net mvc 匿名访问
原文地址: https://blog.csdn.net/zjlovety/article/details/17095627 前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个 ...
随机推荐
- CSS 样式书写规范+特殊符号
虽然我只是刚踏入web前端开发圈子.在一次次任务里头,我发觉每一次的css命名都有所不同和不知所措.脑海就诞生了一个想法--模仿大神的css命名样式. 毕竟日后工作上,是需要多个成员共同协作的.如果没 ...
- Python运维开发基础-概述-简介
Python基础知识分为以下几块 1.Python概述 2.基础语法 3.数据结构 4.Python进阶 5.实训案例 一.Python概述 1.Python简介 2.Hello World 3.搭建 ...
- nodejs之url模块
鄙人初步学习nodejs,目前在读<nodejs入门>这一本书,书很小,但是让我知道了如何用nodejs创建一个简单的小项目.例如如何创建一个服务器啦,例如http.createServe ...
- 谈谈localhost与127.0.0.1
localhost意为本地主机,指这台计算机,是给回路网络接口的标准主机名,对应的IP地址为127.0.0.1,可访问本地服务器的web项目(http://localhost). 那么它们有什么区别呢 ...
- Linux,activemq-cpp之消息过滤器
假设过滤器字符串如下: filt1=aaaa filt2=bbbb filt3=cccc activeMQ-cpp中消息过滤器,在发送消息的producer.cpp中,对message进行属性设置,m ...
- (转)Java compiler level does not match解决方法
背景:工作中导入以前的项目,导出报Java compiler level does not match the versionof the installed Java project facet. ...
- 【SignalR学习系列】8. SignalR Hubs Api 详解(.Net C# 客户端)
建立一个 SignalR 连接 var hubConnection = new HubConnection("http://www.contoso.com/"); IHubProx ...
- VM虚拟机中安装Linux操作系统
本文操作步骤,笔者已实验成功 (前提:正确安装VM并激活) 1,点击新建虚拟机,在页面上选择"自定义",点击下一步 2,进入选择虚拟机硬件兼容页面,这里一般不用操作,直接点击下一步 ...
- c++ STL 容器——联合容器
STL提供了四种联合容器 set,multiset,map,multimap; set and multiset在<set>头文件 map and multimap在<map> ...
- 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的顺序输出,如果传入的是一个字符串,就将字符串反序输出。
namespace test2 { class Program { /// <summary> /// 编写一个类,其中包含一个排序的方法Sort(),当传入的是一串整数,就按照从小到大的 ...