具有IIdentity的MVC过滤数据库

时间:2012-03-13 23:06:34

标签: asp.net-mvc security repository-pattern

在我的MVC网站上,教师登录并且应该查看他的班级以及他班级中使用的所有书籍。

老师不应该看到其他人上课或预定。

这是我的模特

public class Teacher
{
    public int Id { get; set; }

    public string Name {get; set;}
}

public class Books
{
    public int Id {get; set;}

    public string Title {get; set;}

    public int CourseId {get; set;}
}

public class Course
{
    public int Id {get; set;}

    public int Name {get; set;}

    public int TeacherId {get; set;}
}

我使用带有UnitOfWork的RepositoryPattern。

为了让所有课程得到展示,我应该在我的控制器中输入这样一行:

var classes = classRepository.All.Where(x => x.TeacherId == currentTeacher.Id)

BookControler的情况会变得更糟,因为我需要检查currentTeacher的所有类:

var classes = classRepository.All.Where(x => x.TeacherId == currentTeacher.Id)
var books = bookRepository.All.Where(x => classes.Contains(y => y.Id == x.CourseId)

在我看来,这种方法可能会导致一些功能性错误。 我想要做的是,当教师登录我的存储库时自动过滤以便仅保留有关当前教师的数据,因此在我的控制器中我会:

var classes = classRepository.All; // Already filtered on currentTeacher

var books = bookRepository.All; // Already filtered on currentTeacher

这可能吗?怎么样?

1 个答案:

答案 0 :(得分:0)

创建一个新的All(IPrincipal user)方法,在该方法中传入当前经过身份验证的用户。此All方法将在对象上下文的教师集合中查找Identity.Name值,以获取随后返回的ID。

即。 .Where(x => x.TeacherId == currentTeacher.Id)是此新All方法的返回值。