传递参数和自定义属性

时间:2013-04-18 14:06:45

标签: asp.net-mvc custom-attributes

我不确定我的问题在哪里。我想创建一个自定义授权属性来检查角色和权限。我们的权限不是您的标准,此角色具有这些权限,但每个角色的更多权限可以拥有一些权限,但不能拥有其他权限。

我已经覆盖了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
    }

我无法将依赖注入到重写方法中,因为我无法将注入传递给属性。

我意识到这不是解决问题的好方法,但在我们与客户合作之前,我们需要相应地开发更好的实践。

我的主要问题是:是否有更好的方法来创建允许此类行为的自定义授权过滤器?

1 个答案:

答案 0 :(得分:1)

如果您认为仅仅因为您在控制器中实例化了存储库,那么每个请求都将使用相同的实例,那么您就错了。每次都会实例化控制器。因此,您不仅仅是通过在属性中实例化repos来节省自己。鉴于使用属性的局限性,实际上没有更好的方法可以让它访问依赖项,并且在控制器上使用静态是一个非常糟糕的主意。