首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按用户访问权限过滤数据

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

Stack Overflow用户
提问于 2012-04-16 02:11:03
回答 1查看 228关注 0票数 0

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

用户是许多“联盟”的一部分,并且创建针对这些联盟之一的“事件”。

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

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

目前,用户->联盟关系与其余数据保存在相同的位置,因此我可以只按联盟进行过滤,没有问题。我的问题是,我不确定是否应该访问HttpContext来获取存储库层中的userId来执行过滤。

如果我不做上面的事情,我正在考虑使用RoleMembership的功能,让联盟,角色,然后有内置的功能来做到这一点。

问题是,在MVC3/Entity中按用户访问过滤结果数据的最佳实践是什么?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-16 02:55:59

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

因此,存储库是独立的;角色提供程序依赖于HttpContext(我从您的问题中收集到的);视图模型具有存储库和角色提供程序的依赖关系。我要强调的是,为了便于测试,您要为计划使用的任何HttpContext方法编写依赖项包装。

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

举例说明:

代码语言:javascript
复制
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());
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10164677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档