filter实现权限控制

    运用AOP的思想,让我们的系统变得可配置。增强了系统的可维护性和代码重用性,让业务逻辑更加清晰,将公共的部分(日志、权限、事务、工作流等)分离出来。

    AOP的思想,请看上篇博客:http://blog.csdn.net/u010785685/article/details/44139437

    我AOP的设计理念在软件开发中的应用越来越广泛,这不是一个高大上的东西,而是每个程序员都应该熟知的一个东西。因为它方便的就是我们程序员。使用AOP,我们可以专注于逻辑代码的编写,将那些系统功能统一交给AOP框架去管理,在运行时自动耦合起来。

    我用filter实现的是对请求URL的一个权限控制。

    当我们访问URL页面时,比如A可以浏览所有页面。B只可以浏览一部分页面,如果没有一个统一的权限控制,只要URL地址正确,大家都可以访问。这样就没权限控制可言了。所以在访问页面中之前,我们先去自动执行我写的权限判断。

   具体知道我要干什么了,那么怎么实现呢?

   我自定义了一个filter——AuthAttribute。

1、假如我要执行如下这个Controller下的Action。 这个Controller和Action都是大家自己编写的,这里只是个实例。

namespace ITOO.BasicPlaceClient.Controllers
{
    //控制器类,继承了Controllers

    public class MyController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }
    }
}

2、在执行之前,先进行权限判断,执行我写的这个自定义的filter。在这里,我们会取出你简要访问的Controller和Action,在缓存了取出你所拥有的访问权限。在这里判断你是否有访问该Controller里的Action的权限。没有权限,直接给出友好提示,你没有权限。嘿嘿,还算是友好吧。但是你要是拥有权限,他会继续执行你要访问的Action,将你想要见到的页面呈现给您。

/************************************************* 
作者:赵亚盟
小组:AOP小组 
说明:AOP权限控制,当我们访问URL地址时,先判断是否有访问权限。
创建日期:2015年3月19日11:56:15
版本号:v1.0
**********************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ITOO.Library.Core.Memcache;
using System.Collections;

namespace ITOO.BasicPlaceClient.Controllers.Attribute
{
    /// <summary>
    /// ActionFilterAttribute是Action过滤类,该属于会在执行一个action之前先执行.而ActionFilterAttribute是 MVC的一个专门处理action过滤的类.基于这个原理 做的一个权限限制。
    /// </summary>
    public class AuthAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 在执行操作方法之前由 ASP.NET MVC 框架调用
        /// </summary>
        /// <param name="filterContext"></param>
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            获取 controllerName 名称
            var controllerName = filterContext.RouteData.Values["Controller"].ToString();

            ///获取你将要执行的Action的域名
            var actionName = HttpContext.Current.Request.RequestContext.RouteData.Values["Action"].ToString();

            Guid selfGuid1 = Guid.NewGuid();//申请了一个模拟的GUID
            Guid selfGuid2 = Guid.NewGuid();//申请了一个模拟的GUID

            MemcacheHelper.Add(selfGuid1.ToString(), "QueryBed", DateTime.Now.AddMinutes(20));  //Controller存入缓存
            MemcacheHelper.Add(selfGuid2.ToString(), "Index", DateTime.Now.AddMinutes(20));   //Action存入缓存

            //创建一个List集合
            List<string> guids1 = new List<string>();

            //将缓存里取出的key值存放到List里
            guids1.Add(selfGuid1.ToString());
            guids1.Add(selfGuid2.ToString());

            //创建数据字典getkey对象
            IDictionary<string, object> getkey = new Dictionary<string, object>();

            //获取一组缓存
            getkey = MemcacheHelper.Get(guids1);

            //验证权限,先验证Controller       
            foreach (KeyValuePair<string, object> kvp in getkey)
            {
                //如果有将要访问的Controller的权限
                if (kvp.Value.ToString() == controllerName)
                    //如果有将要访问的Acting的权限
                    foreach (KeyValuePair<string, object> kvp1 in getkey)
                        if (kvp1.Value.ToString() == actionName)
                        {
                            //全部通过,则存在访问将要访问的Controller下的Action
                            return;
                        }
            }
            //没有权限,验证不通过
            ContentResult Content = new ContentResult(); 
            Content.Content = "<script type='text/javascript'>alert('权限验证不通过!');history.go(-1);</script>";
            //执行结果为权限不通过
            filterContext.Result = Content;
        }

    }
}

    这是权限判断的代码。在使用它之前,我们要在Global里面的RegisterGlobalFilters进行注册。否则在方法执行之前是不会执行这段代码的。

3、注册:

  filters.Add(new AuthAttribute());

    这样,就实现了一个简单的权限控制。技术浅薄,就写成这样了,有什么不对的大家互相交流。

    个人理解:对于Spring.AOP 会更加高大上一些,不过原理都是大同小异。不会的都是高大上的,嘿嘿,继续学习。多多交流和沟通、欢迎刚和我交流。

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值