0

私の問題をどこに行けばよいかわかりません。役割と権限を確認するためのカスタム承認属性を作成したいと考えています。私たちの権限はあなたの標準ではありません。この役割にはこれらの権限がありますが、各役割の多くはいくつかの権限を持つことができますが、他の権限は持つことができません.

AuthorizeAttribute クラスの AuthorizeCore メソッドをオーバーライドしました。

 internal class RoleAttribute : AuthorizeAttribute
{
    private readonly IUserRepository _userRepository;
    private readonly IPermissionRepository _permissionRepository;

    public RoleAttribute(IUserRepository userRepository, IPermissionRepository permissionRepository)
    {
        _userRepository = userRepository;
        _permissionRepository = permissionRepository;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        User user = _userRepository.GetUsers();
        Permission permission = _permissionRepository.GetPermissions();
        return user.Permissions.Where(x => x.Id == permission.Id).Any();
    }
}

そのため、属性を実装すると:

         private static IUserRepository _userRepository;
    private static IPermissionRepository _permissionRepository;

    public TopNavigationController(IUserRepository userRepository, IPermissionRepository permissionRepository)
    {
        _userRepository = userRepository;
        _permissionRepository = permissionRepository;
    }

    [Role(_userRepository, _permissionRepository)]
    public ActionResult MethodThatHasStuff()
    {
         //Do stuff return stuff if user has the permissions
    }

インジェクションを属性に渡すことができないため、オーバーライドされたメソッドに依存性をインジェクトすることはできません。

これは問題に取り組む良い方法ではないことは承知していますが、顧客と協力してより良いプラクティスに向けて何かを解決できるようになるまでは、それに応じて開発する必要があります。

私の主な質問は、この種の動作を許可するカスタム承認フィルターを作成するより良い方法はありますか?

4

1 に答える 1

1

コントローラーでリポジトリーをインスタンス化するという理由だけで、各リクエストに同じインスタンスが使用されるという考えがある場合、それは間違いです。コントローラーは毎回インスタンス化されます。その結果、単に属性でリポジトリをインスタンス化するだけでは、あまり節約できません。属性の使用には制限があるため、依存関係へのアクセスを許可するより良い方法はありません。コントローラーで静的を使用することは非常に悪い考えです。

于 2013-04-18T14:37:33.570 に答える