0

カスタム ユーザー/ロール プロバイダーを使用する ASP.NET MVC4 サイトがあります。Entity Framework は、最下位レベルでユーザー エンティティとロール エンティティを操作します。ここで、s の概念を紹介しRolePermissionます。各ロールには、このロールのユーザーがシステム内で特定のアクション (コメントの削除など) を実行できるようにする権限のリストが関連付けられています。

カスタム ビルドの管理パネルで、コントローラーのすべてのアクションを一覧表示し、現在のユーザーのロールに権限が存在するかどうかに基づいて、アクションの呼び出しを許可または禁止したいと考えています。

質問は次のとおりです。

  1. 出来ますか?
  2. コントローラーで一連のアクションを一覧表示するにはどうすればよいですか。
  3. アクションとロールのアクセス許可の間の関連付けを割り当てたり、キャンセルしたりするにはどうすればよいですか。

考えられる戦略:

すべてのコントローラーとアクションに適用されるグローバル カスタム フィルターを導入し、データベースをチェックして、論理的な関連付けがあるかどうかを確認します。このようにして、ユーザーがアクションを呼び出すたびにチェック コードが実行されます。それでも、コントローラーとアクションをリストするにはどうすればよいですか (おそらくリフレクションを介して?)

4

1 に答える 1

1

それでも、コントローラーとアクションをリストするにはどうすればよいですか (おそらくリフレクションを介して?)

はい、反射はそれを行う 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
    }
}
于 2012-10-19T11:50:37.563 に答える