利用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系统的基础功能,一个 ...
随机推荐
- jvm003 类加载的过程
类加载的过程 一.加载 在加载阶段虚拟机需要完成以下三件事: 通过一个类的全限定名称来获取此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的 ...
- angularjs-1.3代码学习 模块
花了点时间,阅读了下angularjs的源码.本次先从模块化开始. angular可以通过module的api来实现前端代码的模块化管理.跟define类似.但不具备异步加载脚本的功能.先从最基本的m ...
- (转)Spring 的 init-method 和 destory-method
背景:今天在项目中看到spring中bean在初始化和注销时候的方法定义,之前没有用过这种方式,在此记录下,方便后期查看! 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: ...
- opencv+python3.4的人脸识别----2017-7-19
opencv3.1 + python3.4 第一回合(抄代码,可实现):人脸识别涉及一个级联表,目前能力还无法理解. 流程:1.读取图像---2.转换为灰度图---3.创建级联表---4.对灰度图 ...
- 【HTML】canvas学习小结
1. 绘制基本图形 -----上下文---------------------------------------------------------- canvas.getContext('2d') ...
- Python学习记录----类型匹配(转)
import types aaa = 0 print type(aaa) if type(aaa) is types.IntType: print "the type of aaa is i ...
- Intellij IDEA 2017 详细图文教程之概述
天天编码 , 版权所有丨本文标题:Intellij IDEA 2017 详细图文教程之概述 转载请保留页面地址:http://www.tiantianbianma.com/intellij-idea- ...
- APMServ中的 Apache无法启动…
情况1. 找问题:C:\APMServ5.2.6\Apache\bin点击httpd.exe 会出现: path is invalid.(地址无效) 解决办法:找到C:/APMServ5.2.6/Ap ...
- hdu 6047 Maximum Sequence(贪心)
Description Steph is extremely obsessed with "sequence problems" that are usually seen on ...
- 【.net 深呼吸】在配置节中使用元素集合
前一篇博文中,老周介绍了自定义配置节的方法,本文咱们再往深一层,再看看如何在自定义的配置节中使用配置元素集合. 前面咱们说过,Configuration Section是特殊的配置元素,它可以包装一类 ...