【问题标题】:Autofac: How to force all methods of objects that inherit from a particular interface to have an attributeAutofac:如何强制从特定接口继承的对象的所有方法具有属性
【发布时间】:2012-05-02 09:10:18
【问题描述】:

问题 我正在 MVC .NET 中制作权限系统。我试图强制从 IModel 继承的所有方法都具有特定的属性,例如。权限

例如,

  public class User : IModel
  { 
    [Permission(Admin, Moderator)
    public User GetUser(long userId){...}

    [Permission(Admin)
    public User DeleteUser(long userId){...}

    public User EditUser(long userId){...}
  }

有没有办法强制 User 的所有公共方法都具有 Permission 属性?例如,如果 EditUser 没有 Permission 属性,上面的代码应该会在启动时失败。

可能的解决方案

我正在考虑使用 Autofac(依赖注入)来完成这项工作。但是,我对 .Net 或 Autofac 还不是很熟悉。有关如何解决此问题的任何建议?

【问题讨论】:

    标签: c# .net autofac custom-attributes


    【解决方案1】:

    我会编写一个使用反射来验证属性是否存在的单元测试。

    foreach(var method in typeof(User).GetMethods())
    {
        var permissionAttributes = method.GetCustomAttributes(typeof(PermissionAttribute)).Cast<PermissionAttribute>();
    }
    

    上面的代码可能无法编译——从内存中写入;-)

    另外,如果你想拦截方法调用并检查权限,你可能想用谷歌搜索interceptor。 DI 不会帮你的。

    【讨论】:

    • 这很有趣。谢谢。您能否给我一个有关如何编写此类单元测试的代码示例或将我引导到任何可能有帮助的站点。该解决方案听起来很简洁,但为了极其安全(因为我们正在谈论安全性),我们可以在单元测试之外添加依赖注入 - 对于代码部署失败测试的极端情况。
    • 我喜欢拦截器Idea。您可以使用 Autofac [code.google.com/p/autofac/wiki/DynamicProxy2] 拦截特定接口的方法调用,在您的情况下它将是 IModel。有人在做这样的事情 [stackoverflow.com/questions/6238012/….
    【解决方案2】:

    您通常会在控制器而不是模型上的操作级别控制授权。 MVC 框架已经有一个支持角色的 Authorize 属性。

    http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

    可以将此属性放置在控制器上以强制对所有操作进行授权。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-02
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多