0

伙计们,我已经阅读了很多关于这件事的帖子,但我还看不到这里的光芒。

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

这是我的例子-

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

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

有人可以向我展示一个示例,其中我实现了一个权限类以在我的所有模型中使用它吗?

谢谢!

4

1 回答 1

0

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

我根据用户当前在其 CurrentUser 类中的角色来限制视图中的项目,并且仅在必要时将 CurrentUser 对象传递给视图。CurrentUser 类在应用程序启动时被实例化,并且可以根据需要尽可能多地或尽可能少地更新。我正在处理的当前应用程序需要相当频繁地更新用户的角色。

如果角色保存在 CurrentUser 对象中,则可以轻松地检查控制器和模型中的用户权限。实现一个方法,例如(使用 MVC Simple Membership Provider):

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

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

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

于 2013-03-28T02:20:21.420 回答