好久没写过博客了,突然发现最后博客更新时间是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属性实现权限验证的更多相关文章

  1. MVC 自定义AuthorizeAttribute 实现权限验证

    MVC内置的AuthorizeFilter先于Action/Result过滤器执行,为网站权限验证提供了很好的一套验证机制. 通过自定义的AuthorizeAttribute可以实现对用户权限的验证. ...

  2. MVC权限验证过滤器

    Action属性,权限设定属性   [AttributeUsage(AttributeTargets.Method, Inherited = true, AllowMultiple = false)] ...

  3. 关于filter web api mvc 权限验证 这里说的够详细了。。。

    参考:http://www.cnblogs.com/willick/p/3331520.html Filter(筛选器)是基于AOP(面向方面编程)的设计,它的作用是对MVC框架处理客户端请求注入额外 ...

  4. 【3】.net MVC 使用IPrincipal进行Form登录即权限验证

    1.在MVC项目中添加用户类,可以根据实际项目需求添加必要属性 public class UserData { /// <summary> /// ID /// </summary& ...

  5. ASP.NET MVC权限验证 封装类

    写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一个全局过滤器 //受权过滤器 publi ...

  6. Spring MVC 使用拦截器优雅地实现权限验证功能

    在上一篇 SpringAOP 实现功能权限校验功能 中虽然用AOP通过抛异常,请求转发等勉强地实现了权限验证功能,但感觉不是那么完美,应该用拦截器来实现才是最佳的,因为拦截器就是用来拦截请求的,在请求 ...

  7. NET MVC权限验证

    ASP.NET MVC权限验证 封装类 写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一 ...

  8. C# MVC权限验证

    前言 之前一直没怎么接触过权限验证这块,刚好公司老平台改版,就有了这篇权限验证.此篇文章大致讲解下 精确到按钮级别的验证如何实现.以及权限验证设计的参考思路(菜鸟一枚,大神勿喷). 在开发大项目的时候 ...

  9. Web用户的身份验证及WebApi权限验证流程的设计和实现 asp.net mvc AllowAnonymous 不起作用, asp.net mvc 匿名访问

    原文地址: https://blog.csdn.net/zjlovety/article/details/17095627 前言:Web 用户的身份验证,及页面操作权限验证是B/S系统的基础功能,一个 ...

随机推荐

  1. 奔跑在Docker上的Spark

    转自:马踏飞燕--奔跑在Docker上的Spark 目录 为什么要在Docker上搭建Spark集群 网络拓扑 Docker安装及配置 ssh安装及配置 基础环境安装 Zookeeper安装及配置 H ...

  2. 【微信小程序开发教程】如何显示群名称?

    今年 5 月份的时候,微信宣布:「为了更好的针对群场景提供个性化服务,当用户在群聊中点击小程序分享卡片时,小程序支持开发者获取群 ID 和群名称」.但随后没多久,发现小程序只返回了群 ID,并没有给我 ...

  3. 如何制作一个完美的全屏视频H5

    写在前面的话: 最近一波H5广告火爆整个互联网圈,身为圈内人,我们怎能     不! 知!道! :( 嘘!真不知道的也继续看下去,有收获 ↓ ) So,搞懂这个并不难. 这篇文章将带你从头到尾了解H5 ...

  4. SQL Prompt 破解之道

    1. 下载SQL Prompt 5.3.4.1,是个压缩包,里面有三个文件 免登录免积分下载地址:http://download.csdn.net/detail/caizz520/4557385 1) ...

  5. (转)Collections类方法详解

    Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序.搜索以及线程安全等各种操作. 1) 排序(Sort)使用sort方法可以根据元素的自然顺序 对 ...

  6. (转) Spring Boot MyBatis 连接数据库

    最近比较忙,没来得及抽时间把MyBatis的集成发出来,其实mybatis官网在2015年11月底就已经发布了对SpringBoot集成的Release版本,Github上有代码:https://gi ...

  7. 初学Python(四)——set

    初学Python(四)——set 初学Python,主要整理一些学习到的知识点,这次是set. # -*- coding:utf-8 -*- #先来看数组和set的差别 d=[1,1,2,3,4,5] ...

  8. 实例甜点 Unreal Engine 4迷你教程(1)之如何用C++将纹理绘制在UserWidget的Image小部件上

    完成本迷你教程之前,请前往完成以下迷你教程: 无前置教程待完成. 本教程适合的人群: 初学者,具有开发经验两周: 本示例的目的:为了在代码中实现UMG中的这个功能: 说明:这是一些列迷你教程的首篇,所 ...

  9. PocScan的搭建与使用

    安装Docker, 然后下载镜像 $ sudo curl -sSL https://get.daocloud.io/docker | sh $ sudo systemctl start docker ...

  10. MyBatis String类型传递参数注意事项

    Mybatis查询sql传入一个字符串传参数,报There is no getter for property named 'ids' in 'class java.lang.String'. 后来改 ...