按用户的访问权限过滤数据

时间:2012-04-15 18:11:03

标签: c# asp.net-mvc-3 entity-framework-4

我在MVC3中使用Entity编写了一个网站(链接到Postgres,但不确定该部分是否相关。

用户是许多“联盟”的一部分,并且会针对其中一个联盟创建“事件”。

将有其他用户可以访问该联盟,当他们去查看事件列表时,我需要列表仅显示他们有权访问的“联盟”中的那些“事件”。

现在有很多方法可以实现这一目标,但我正在寻找最优雅和被广泛接受的“正确方法”。

目前用户 - >联赛关系与其他数据保持在同一个地方,因此我可以毫无问题地通过联赛过滤。我的问题是我不确定是否应该访问HttpContext以使存储库层中的userId进行过滤。

如果我不这样做,我正在考虑使用RoleMembership功能并制作Leagues,Roles,然后内置功能来实现。

问题是,在MVC3 / Entity中用户Access过滤结果数据的最佳做法是什么?

首选博客/教程链接,但也可以接受完整答案......

1 个答案:

答案 0 :(得分:1)

我绝对不认为存储库应该调用HttpContext对象。我建议遵循此应用程序的依赖注入模式。在这种情况下,有三个接口 - 一个是数据访问接口(存储库);另一个是为您的视图提供过滤数据的提供者(视图模型);第三个是角色信息提供者(角色提供者)。

所以,存储库是独立的;角色提供者在HttpContext上有依赖关系(我从你的问题中收集);并且视图模型依赖于存储库和角色提供程序。我要强调的是,你编写了一个依赖包装你想要使用的任何HttpContext方法,以便于测试。

在MSDN上有一个关于依赖注入和MVC的相当广泛的教程:http://msdn.microsoft.com/en-us/gg618491

举例说明:

public interface ILeagueRepository 
{
    IEnumerable<League> All;
}

public interface ILeaguesProvider
{
    IEnumerable<League> GetUserLeagues(string Username);
}

public class LeaguesProvider : ILeaguesProvider
{
    public LeaguesProvider(ILeagueRepository repository)
    {
         // ...
    }
    public IEnumerable<League> GetUserLeages(string Username)
    {
        return _repository.All.Where(league=>league.User == Username);
    }
}

public ActionResult LeaguesController
{
    public LeaguesController(ILeaguesProvider providerDependency, IRoleProvider roleDependency)
    {
        IEnumerable<League> leagues = providerDependency.GetUserLeagues(roleDependency.GetCurrentUser());
    }
}