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

本文关键字:权限 过滤 数据 访问权 访问 用户 | 更新日期: 2023-09-27 18:31:07

我正在使用实体(链接到Postgres,但不确定该部分是否相关)在MVC3中编写一个站点。

用户是多个"联赛"的一部分,并针对其中一个联赛创建"事件"。

会有其他用户有权访问该联赛,

当他们去查看赛事列表时,我需要该列表仅显示属于他们有权访问的"联赛"一部分的"赛事"。

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

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

如果我不做上述操作,我正在考虑使用 RoleMembership 功能并制作联赛、角色,然后有内置功能来做到这一点。

问题是,在 MVC3/实体中按用户访问筛选结果数据的最佳做法是什么?

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

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

我绝对不认为存储库应该调用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());
    }
}