人们,我已经就这件事发了很多帖子,但我还没有看到它的亮点。
在控制器中请求执行/执行或显示某些内容的权限非常容易,但在模型中执行它更复杂,至少在我身上发生了什么。 在控制器中,因为你可以轻松访问会话对象:HttpContext.Current.Session [“UserPermissions”],从视图中我可以有一个sessionmanager和这样的访问:SessionManager.IsAllowed(Permission.SuperUser),这也是在控制器中构造。但是,如何在模型和连接数据库的业务层中轻松实现?
这是我的例子 -
当我需要从数据库获取一些信息并且基于用户权限时,我不想用我知道用户无权访问的数据填充对象。
在视图中解析对象并显示用户允许查看的项目很容易,但在将它们带到视图之前甚至不能更好地过滤这些项目?
有人可以告诉我一个示例,我实现了一个权限类来跨所有模型使用它吗?
谢谢!
答案 0 :(得分: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传递给数据抽象层(位于数据库顶部的层),而是以访问要求可以作为参数传递或实现单独方法的方式实现方法对于您可能正在使用的每个角色。