好久没写过博客了,突然发现最后博客更新时间是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. HTTP消息中Header头部信息整理

    1.HTTP请求方式 GET 向Web服务器请求一个文件 POST 向Web服务器发送数据让Web服务器进行处理 PUT 向Web服务器发送数据并存储在Web服务器内部 HEAD 检查一个对象是否存在 ...

  2. Html table 合并单元格

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. SLAM中的优化理论(一)—— 线性最小二乘

    最近想写一篇系列博客比较系统的解释一下 SLAM 中运用到的优化理论相关内容,包括线性最小二乘.非线性最小二乘.最小二乘工具的使用.最大似然与最小二 乘的关系以及矩阵的稀疏性等内容.一方面是督促自己对 ...

  4. 【转载】Android 开发 命名规范

    原文地址:http://www.cnblogs.com/ycxyyzw/p/4103284.html 标识符命名法标识符命名法最要有四种: 1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外, ...

  5. 回味Python2.7——笔记3

    一.错误和异常 1.异常处理 >>> while True: ... try: ... x = int(raw_input("Please enter a number: ...

  6. PHP中通过sqlsrv调用存储过程——成绩排名去除重复字段的数据行

    培训考试项目中,需要实现考试成绩排名:排名参考项为分数(score降序).参加日期(attendtime升序).第几次参加考试(frequency升序):并且,每个用户只保留一条数据(pid). 考试 ...

  7. 【ES6】变量的解构赋值

    1. 数组 var [a, b, c] = [1, 2, 3]; let [a, [b], d] = [1, [2, 3], 4]; 默认值生效的条件是,对象的属性值严格等于undefined. [x ...

  8. CSS随笔2

    1. css中: a:link { /*表示普通的,未被访问的链接状态*/    color: black;} a:visited { /*表示链接被访问过后的状态*/    color: bluev ...

  9. maven相关的学习资料

    1, maven的settings配置文件详解: http://blog.csdn.net/jinshuaiwang/article/details/23686099 2,maven原理---翡青的博 ...

  10. Python操作Zip文件

    Python操作Zip文件 需要使用到zipfile模块 读取Zip文件 随便一个zip文件,我这里用了bb.zip,就是一个文件夹bb,里面有个文件aa.txt. import zipfile # ...