通过n层应用程序传递用户标识

本文关键字:用户标识 应用程序 通过 | 更新日期: 2023-09-27 18:25:24

我有一个MVC.Net应用程序,它被分为多个层,包括存储库、业务逻辑和AngularJS和MVC控制器的前端服务。

存储库目前是独立的,并没有封装在一个工作单元模式中。这次重构即将发生。

我想向人们询问,在他们的经验中,将当前登录的用户带到各个层以实现存储库级别的安全性的最有效方式是什么。

目前,我有一个UserLogic类,它维护对当前登录用户实体的引用。然后,这个UserLogic类被注入控制器/业务逻辑等中……但我怀疑这是一个相当复杂的机制!

通过n层应用程序传递用户标识

一种方法是让任何给定的存储库在实例化时都需要用户上下文。类似这样的东西:

public class WidgetRepository
{
    private UserContext User { get; set; }
    public WidgetRepository(UserContext user)
    {
        if (user == null)
            throw new ArgumentNullException("user");
        // maybe also confirm that it's a *valid* user in some way?
        User = user;
    }
    // repository operations
}

我想,您可以在该构造函数中使用任意多的"防御性编程"。然后,在存储库操作中,您可以根据该用户筛选查询。类似于:

public IEnumerable<Widget> Widgets
{
    get
    {
        return dbContext.Widgets.Where(w => w.Owner.Id == User.Id);
    }
}

这将由拥有小部件的用户对应用程序透明地过滤所有小部件。

请记住,这类事情需要权衡取舍。这样做在某些情况下可能效果非常好,而在其他情况下则不太好。如果DAL基于用户上下文透明地过滤数据,那么使用相同的DAL执行系统(非用户)操作或管理(超级用户)操作可能会变得相当困难。不可能说这是否会是我目前对贵系统的了解的问题,这只是我过去看到的问题的一个提醒。