2012-10-19 46 views
0

我有一個帶有自定義用戶/角色提供程序的ASP.NET MVC4站點。實體框架與底層的用戶和角色實體協同工作。現在我介紹一個RolePermission的概念。每個角色都有一個asscocialted權限列表,允許此角色的用戶在系統內執行某些操作,例如刪除註釋。爲ASP.NET MVC4中的控制器操作分配自定義類權限檢查

在我的自定義生成管理面板中,我想列出控制器的所有操作,並且能夠根據curent用戶角色中權限的前提允許或禁止對某個操作的調用。

的問題是:

  1. 這可能嗎?
  2. 如何列出控制器中的一組操作。
  3. 如何分配或取消操作與角色權限之間的關聯。

可能starategy:

我介紹的是適用於所有控制器和行動的一個全球性的自定義過濾器,來檢查我的數據庫,看看我是否有邏輯關聯。這樣,每次用戶撥打某個操作時都會運行檢查代碼。不過我怎麼列出控制器和行動(通過反射吧?)

回答

1

不過我怎麼列出控制器和行動(通過反射吧?)

是的,反思是做這件事。這裏有一個如何讓所有控制器類型列表的例子:

public IEnumerable<Type> GetControllers() 
{ 
    IEnumerable<Type> typesSoFar = Type.EmptyTypes; 
    var assemblies = BuildManager.GetReferencedAssemblies(); 
    foreach (Assembly assembly in assemblies) 
    { 
     Type[] typesInAsm; 
     try 
     { 
      typesInAsm = assembly.GetTypes(); 
     } 
     catch (ReflectionTypeLoadException ex) 
     { 
      typesInAsm = ex.Types; 
     } 
     typesSoFar = typesSoFar.Concat(typesInAsm); 
    } 
    return typesSoFar.Where(type => 
     type != null && 
     type.IsPublic && 
     type.IsClass && 
     !type.IsAbstract && 
     typeof(IController).IsAssignableFrom(type) 
    ); 
} 

,然後你可以得到的ActionDescriptor列表每個控制器類型:

foreach (var controller in GetControllers()) 
{ 
    ActionDescriptor[] actions = new ReflectedControllerDescriptor(controller).GetCanonicalActions(); 
    foreach (var action in actions) 
    { 
     // here you know everything about the action 
    } 
} 
+0

出於某種原因,該動作列表總是空becuase'controller.GetType()返回一個RuntimeType,當反映爲ControllerDescriptor時沒有任何操作。但是controller.Name是我的網站控制器的正確名稱。 –

+0

好的,發現一個問題 - 'ReflectedControllerDescriptor(controller).GetCanonicalActions();'因爲控制器變量已經擁有一個類型對象,所以不需要調用controller.GetType()。 –

相關問題