【问题标题】:Authorize method usage using PostSharp AOP使用 PostSharp AOP 授权方法使用
【发布时间】:2016-12-25 03:25:20
【问题描述】:

我正在使用基于自定义声明的授权,以便根据用户访问权限创建具有功能的面板。用户声明存储在缓存ICashClient 中。 特定的菜单只是引用某些控制器方法。

问题是: 只需输入特定方法的直接链接,就可以使用由于缺少访问权限而不应使用的方法。

我的想法是创建一个方面,以便可以标记这些特定方法,以防止它们被非法执行。

我想再次在OnEntry 方法中进行授权。

以下示例允许检查对服务器的请求是否为 Ajax 类型。

 public override void OnEntry(MethodExecutionArgs args)
        {

            var controller = args.Instance as MyController;

            if (controller != null)
            {

                if (!controller.Request.IsAjaxRequest())
                    throw new Exception ($"{args.Method.Name} invalid AJAX request");
            }

            base.OnEntry(args);
        }

在这种OnEntry 方法的上下文中,我有什么可能从现金中查询现有数据? 我怎样才能从那里获得这笔现金?

编辑: 我的控制器使用(使用依赖注入)所谓的QueryProcessor 来检索具有以下方法的请求数据:

 public TResult ExecuteWithCache<TResult>(ICustomQuery<TResult> query)
        {
            try
            {
                //class for creating fingerprint of query 
                var customQueryHash = (ICustomQueryHash<TResult>)query;

                //fingerprint of the query 
                var queryString = customQueryHash.GetQueryHash();    

                //cash which might holds data
                var cachedResult = _cacheClient.Get<TResult>(queryString);




                 ...
             }
             catch(){}


  }

_cashClient 是扩展 ICashClient 的实现。

【问题讨论】:

  • 您能否举例说明您目前如何从代码中访问缓存?
  • 更新描述

标签: c# aop postsharp


【解决方案1】:

我了解您需要访问自定义方面类中的依赖项,并且此依赖项通常使用依赖注入来解决。在这种特殊情况下,您希望访问 QueryProcessor 的实例。

依赖注入框架无法自动解决切面的依赖关系,因为框架无法控制切面的构造和生命周期。然而,有许多方法可用于消耗方面内部的依赖关系。它们在此文档部分中进行了描述:http://doc.postsharp.net/consuming-dependencies

以下是从方面消耗依赖关系的一些方法的简短描述。您可以根据您的项目和您使用的依赖框架选择最佳方法。

Global service locator. DI 框架通常提供一种方法来查询特定实例的当前对象图(例如context.GetInstance&lt;T&gt;())。

public override void OnEntry(MethodExecutionArgs args)
{
    var queryProcessor = ServiceLocator.GetInstance<IQueryProcessor>();
}

Global composition container。一些 DI 框架还允许您在构造初始图之后满足新对象的依赖关系。你可以在你的切面中重写RuntimeInitialize方法来在切面实例初始化时导入依赖。

[PSerializable]
public class MyAspect : OnMethodBoundaryAspect
{
    [Import]
    public IQueryProcessor QueryProcessor { get; set; }

    public override void RuntimeInitialize(MethodBase method)
    {
        ServiceInjector.BuildObject(this);
    }
}

Import dependencies from the target object。当依赖项存储在目标对象的属性或字段中时,您可以使用[ImportMember] 建议导入它们。在这种情况下,您的方面必须实现 IInstanceScopedAspect

[PSerializable]
public class MyAspect : OnMethodBoundaryAspect, IInstanceScopedAspect
{
    [ImportMember("QueryProcessor", IsRequired = true)] 
    public Property<IQueryProcessor> QueryProcessor;

    public override void OnEntry(MethodExecutionArgs args)
    {
        this.QueryProcessor.Get().ExecuteWithCache(/* ... */);
    }

    object IInstanceScopedAspect.CreateInstance(AdviceArgs adviceArgs)
    {
        return this.MemberwiseClone();
    }

    void IInstanceScopedAspect.RuntimeInitializeInstance()
    {
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多