在视图中请求许可是正确的,或者它应该是MVC中的模型

本文关键字:模型 MVC 或者 请求 视图 许可 | 更新日期: 2023-09-27 18:06:27

朋友们,我已经读了很多关于这个问题的帖子,但我仍然看不到这里的光明。

请求在视图中执行/执行或显示某些内容的权限很容易,但在模型中这样做更复杂,至少是发生在我身上的事情。因为您可以很容易地访问会话对象:HttpContext.Current。Session["UserPermissions"]和从视图我可以有一个sessionmanager和访问像这样:sessionmanager . isallowed (Permission.SuperUser),这也是在控制器中构造的。但是我们如何在连接到数据库的模型层和业务层中轻松地做到这一点呢?

这是我的例子-

当我需要从数据库中获取一些信息并基于用户权限时,我不想用我知道用户没有访问权限的数据填充对象。

在视图中解析对象并只显示用户允许看到的项目很容易,但是在将这些项目带入视图之前过滤这些项目不是更好吗?

有人能告诉我一个例子,我实现一个权限类使用它跨我所有的模型?

谢谢!

在视图中请求许可是正确的,或者它应该是MVC中的模型

我通常有一个驻留在模型旁边的CurrentUser类,我在其中跟踪所有重要的用户属性,例如权限、用户ID、名称、电子邮件地址等。将类保留在模型中可以方便地访问控制器,这是可能发生大部分权限检查的地方,具体取决于应用程序。这也允许将CurrentUser模型作为视图模型传递给视图。

我根据用户当前在CurrentUser类中的角色来限制视图中的项,并且只在必要时将CurrentUser对象传递给视图。CurrentUser类是在应用程序开始时实例化的,可以根据需要或多或少地更新。我目前正在开发的一个应用程序需要相当频繁地更新用户的角色。

如果角色保存在CurrentUser对象中,可以很容易地检查控制器和模型中的用户权限。实现一个方法,如(使用MVC简单成员提供程序):

bool IsUserInRole(string roleName) {
    if (currentUser != null)
        {
            return currentUser.Roles.Contains(roleName);
        }
}

使您能够检查当前角色,而不管您当前处于MVC的哪个部分。

我建议不要将CurrentUser传递给数据抽象层(位于数据库顶部的层),而是以一种方式实现方法,要么可以将访问需求作为参数传递,要么为您可能使用的每个角色实现单独的方法。