我需要为不同类型的用户创建不同的页面视图。我已经在这里问过了:How to create pages with different permissions' views
尽管Aldeel的答案有效,但对我来说似乎不是最好的解决方案。我会解释为什么。
我会试着非常详细地解释我需要什么,并希望你们中的一些人能够帮助我:
我需要展示不同的视图,但不仅仅是这样。每个用户都可以访问页面的不同部分。
我举个例子:
想象一个具有以下结构的页面'X‘
Field A
Field B
Field C
Field D当来自组G1的用户U1访问页面X时,系统在页面X上检查该组的权限的DB。用户U1可以看到Field A和Field B,但只能编辑Field A。
设置为无组访问页面X的用户U2。系统会在页面X上检查他的权限。用户U2可以查看和编辑所有字段。
当来自组G2的用户U3访问页面X时,系统在页面X上检查该组的权限的DB。用户U3可以查看Field C和Field D,但不能编辑任何内容。
我希望这很容易理解……
我找不到一种方法来做到这一点,而不是用大量关于特定用户权限的数据填充ViewData。在我的示例中只有4个字段,但在我当前的项目中,我没有少于20个字段的屏幕。所以我猜你可以看到这是多么丑陋和没有生产力。
正如我所说的(facebook example),这个想法类似于社交网络。当用户访问UserX的页面时,只能看到UserX允许他访问的内容。
我真的很感谢你的帮助。
诚挚的问候。
发布于 2011-03-04 01:40:26
要做你想做的事情,你不应该控制你的视图--你实际上必须保护你的控制器--而不是视图。您可以通过控制器属性来完成此操作。类似于下面的内容:
[Authorize]
public class MyController {
}通过这样做,您可以保护整个控制器。如果用户未通过身份验证,则该控制器中的每个操作都不会响应(具体地说,他们将收到401响应)。您可以通过授权单个用户或单个角色来扩展此功能,如以下示例所示:
[Authorize(Users="eestein,JasCav")
public class MyController {
}
[Authorize(Roles="Administrator")]
public class MyController {
}在您的情况下,您可能不希望拥有一个具有授权的整个控制器。很好,ASP.NET MVC提供了对身份验证的操作级控制。所以,你可以这样做:
public class MyController {
public ActionResult Index() { }
[Authorize(Roles="Administrator")]
public ActionResult Admin() { }
}使用这个想法,您可以在这里控制用户在页面上看到的内容。您将希望从您的操作中返回部分页面,以便可以加载页面的各个方面。例如,您可能有一个显示一些普通数据和一些秘密数据的视图。普通数据可以通过普通页面返回。机密数据应作为页面内的部分视图返回。但是,如果出现401,您可以处理它,只是不显示任何内容。
这是相当简单的事情。.NET团队完成了很好的设置工作,您不必在控制器中单独检查权限。我希望这能帮助你入门。联机搜索,了解有关如何使用Authorization属性的更多信息。
更新如果您有一个控制这些权限的页面管理员,那么您必须在设置Authorize属性的方式上灵活一些。这就是“角色”非常重要的地方(根据我上面的例子)。例如,如果管理员说“我要将John Doe添加到SpecialUser角色中”,则John Doe用户将能够访问角色设置为SpecialUser的所有操作(如果这确实是您系统上的角色)。
显然,您必须为管理员提供一些能够做到这一点的方法,Authorize属性很好地做到了这一点。要查看谁对页面具有权限,您必须查询数据库以找出谁是哪个角色的一部分。下面是一种考虑设置的方法:
我希望这能澄清(我希望我充分理解了你的问题)。我认为你正在尝试做的事情是可能的。
更新2是的,这确实假设您的控制器上有静态组,并且任何新的组都必须以编程方式添加。我很想知道什么样的用例需要动态创建不同的权限类型--这看起来很容易被滥用。在任何情况下,我都没有解决方案。
至于局部视图的工作原理是这样的。
public class ProductController : Controller
{
//
// GET: /Index/
public ActionResult Index()
{
return View();
}
public ActionResult Partial1()
{
return PartialView();
}
[Authorize]
public ActionResult Partial2()
{
return PartialView();
}
}在您的Index.aspx文件中,您将拥有如下内容:
<%= Html.RenderAction("Partial1") %>
<%= Html.RenderAction("Partial2") %>如果用户未被授权,您可以处理第二个RenderAction,这样视图就永远不会显示。(您可以在您的控制器中进行检查。)
希望这能澄清一些事情!我正在奔波中,所以我现在不能再多说了。
发布于 2011-03-04 01:43:18
我建议使用“附加”安全性;用户的权限和他的任何组的权限加在一起,可以提供一系列允许他做的事情。如果他没有明确的权限来做一些需要权限的事情,他就不被允许这样做。在您的示例中,在用户U1和组G1之间,有足够的权限授予该用户查看字段A和字段B以及编辑字段A的权限。由于用户本身或通过其组没有明确授予编辑字段B或查看或编辑字段C和D的权限,因此他没有这些权限。
我会通过在代码中添加一个方法来实现这种类型的权限,该方法将接受表示用户及其权限的对象,并将询问这些权限以确定字段的可见性。所有字段在开始时都应该是不可见的,此方法将使它们可见和/或可编辑。
需要注意的事项:
https://stackoverflow.com/questions/5184202
复制相似问题