天天看點

filter實作權限控制

我AOP的設計理念在軟體開發中的應用越來越廣泛,這不是一個高大上的東西,而是每個程式員都應該熟知的一個東西。因為它友善的就是我們程式員。使用AOP,我們可以專注于邏輯代碼的編寫,将那些系統功能統一交給AOP架構去管理,在運作時自動耦合起來。

當我們通路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,将你想要見到的頁面呈現給您。

using

System; 

System.Collections.Generic; 

System.Linq; 

System.Web; 

System.Web.Mvc; 

ITOO.Library.Core.Memcache; 

System.Collections; 

ITOO.BasicPlaceClient.Controllers.Attribute 

///  

///

ActionFilterAttribute是Action過濾類,該屬于會在執行一個action之前先執行.而ActionFilterAttribute是

MVC的一個專門處理action過濾的類.基于這個原理做的一個權限限制。 

public class AuthAttribute : ActionFilterAttribute 

/// 在執行操作方法之前由 ASP.NET MVC 架構調用 

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 =

MemcacheHelper.Add(selfGuid1.ToString(), "QueryBed",

DateTime.Now.AddMinutes(20)); 

//Controller存入緩存 

MemcacheHelper.Add(selfGuid2.ToString(), "Index",

//Action存入緩存 

//建立一個List集合 

List guids1 = new

List(); 

//将緩存裡取出的key值存放到List裡 

guids1.Add(selfGuid1.ToString()); 

guids1.Add(selfGuid2.ToString()); 

//建立資料字典getkey對象 

IDictionary getkey = new

Dictionary(); 

//擷取一組緩存 

getkey =

MemcacheHelper.Get(guids1); 

//驗證權限,先驗證Controller 

foreach (KeyValuePair kvp in

getkey) 

//如果有将要通路的Controller的權限 

if

(kvp.Value.ToString() == controllerName) 

//如果有将要通路的Acting的權限 

foreach (KeyValuePair kvp1 in getkey) 

if (kvp1.Value.ToString() == actionName) 

//全部通過,則存在通路将要通路的Controller下的Action 

return; 

//沒有權限,驗證不通過 

ContentResult Content = new

ContentResult(); 

Content.Content = "

//執行結果為權限不通過 

filterContext.Result =

Content; 

這是權限判斷的代碼。在使用它之前,我們要在Global裡面的RegisterGlobalFilters進行注冊。否則在方法執行之前是不會執行這段代碼的。

3、注冊:

filters.Add(new

AuthAttribute()); 

   這樣,就實作了一個簡單的權限控制。技術淺薄,就寫成這樣了,有什麼不對的大家互相交流。

更多java學習 web架構學習 http://techfoxbbs.com

繼續閱讀