首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建具有不同权限视图的页面

问如何创建具有不同权限视图的页面
EN

Stack Overflow用户
提问于 2011-03-04 01:27:02
回答 2查看 4.6K关注 0票数 0

我需要为不同类型的用户创建不同的页面视图。我已经在这里问过了:How to create pages with different permissions' views

尽管Aldeel的答案有效,但对我来说似乎不是最好的解决方案。我会解释为什么。

我会试着非常详细地解释我需要什么,并希望你们中的一些人能够帮助我:

我需要展示不同的视图,但不仅仅是这样。每个用户都可以访问页面的不同部分。

我举个例子:

想象一个具有以下结构的页面'X‘

代码语言:javascript
复制
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允许他访问的内容。

我真的很感谢你的帮助。

诚挚的问候。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-04 01:40:26

要做你想做的事情,你不应该控制你的视图--你实际上必须保护你的控制器--而不是视图。您可以通过控制器属性来完成此操作。类似于下面的内容:

代码语言:javascript
复制
[Authorize]
public class MyController {
}

通过这样做,您可以保护整个控制器。如果用户未通过身份验证,则该控制器中的每个操作都不会响应(具体地说,他们将收到401响应)。您可以通过授权单个用户或单个角色来扩展此功能,如以下示例所示:

代码语言:javascript
复制
[Authorize(Users="eestein,JasCav")
public class MyController {
}

[Authorize(Roles="Administrator")]
public class MyController {
}

在您的情况下,您可能不希望拥有一个具有授权的整个控制器。很好,ASP.NET MVC提供了对身份验证的操作级控制。所以,你可以这样做:

代码语言:javascript
复制
public class MyController {

    public ActionResult Index() { }

    [Authorize(Roles="Administrator")]
    public ActionResult Admin() { }

}

使用这个想法,您可以在这里控制用户在页面上看到的内容。您将希望从您的操作中返回部分页面,以便可以加载页面的各个方面。例如,您可能有一个显示一些普通数据和一些秘密数据的视图。普通数据可以通过普通页面返回。机密数据应作为页面内的部分视图返回。但是,如果出现401,您可以处理它,只是不显示任何内容。

这是相当简单的事情。.NET团队完成了很好的设置工作,您不必在控制器中单独检查权限。我希望这能帮助你入门。联机搜索,了解有关如何使用Authorization属性的更多信息。

更新如果您有一个控制这些权限的页面管理员,那么您必须在设置Authorize属性的方式上灵活一些。这就是“角色”非常重要的地方(根据我上面的例子)。例如,如果管理员说“我要将John Doe添加到SpecialUser角色中”,则John Doe用户将能够访问角色设置为SpecialUser的所有操作(如果这确实是您系统上的角色)。

显然,您必须为管理员提供一些能够做到这一点的方法,Authorize属性很好地做到了这一点。要查看谁对页面具有权限,您必须查询数据库以找出谁是哪个角色的一部分。下面是一种考虑设置的方法:

  • 您控制操作的角色。
  • 您的管理员控制向谁授予这些角色。
  • 您始终可以检查(通过简单的查询)查看谁被分配了哪个角色。然后,您可以(通过您对操作角色的了解)查看谁可以看到站点的哪些部分。

我希望这能澄清(我希望我充分理解了你的问题)。我认为你正在尝试做的事情是可能的。

更新2是的,这确实假设您的控制器上有静态组,并且任何新的组都必须以编程方式添加。我很想知道什么样的用例需要动态创建不同的权限类型--这看起来很容易被滥用。在任何情况下,我都没有解决方案。

至于局部视图的工作原理是这样的。

代码语言:javascript
复制
public class ProductController : Controller
{
    //
    // GET: /Index/
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Partial1()
    {
       return PartialView();
    }

    [Authorize]
    public ActionResult Partial2()
    {
       return PartialView();
    }
}

在您的Index.aspx文件中,您将拥有如下内容:

代码语言:javascript
复制
<%= Html.RenderAction("Partial1") %>
<%= Html.RenderAction("Partial2") %>

如果用户未被授权,您可以处理第二个RenderAction,这样视图就永远不会显示。(您可以在您的控制器中进行检查。)

希望这能澄清一些事情!我正在奔波中,所以我现在不能再多说了。

票数 4
EN

Stack Overflow用户

发布于 2011-03-04 01:43:18

我建议使用“附加”安全性;用户的权限和他的任何组的权限加在一起,可以提供一系列允许他做的事情。如果他没有明确的权限来做一些需要权限的事情,他就不被允许这样做。在您的示例中,在用户U1和组G1之间,有足够的权限授予该用户查看字段A和字段B以及编辑字段A的权限。由于用户本身或通过其组没有明确授予编辑字段B或查看或编辑字段C和D的权限,因此他没有这些权限。

我会通过在代码中添加一个方法来实现这种类型的权限,该方法将接受表示用户及其权限的对象,并将询问这些权限以确定字段的可见性。所有字段在开始时都应该是不可见的,此方法将使它们可见和/或可编辑。

需要注意的事项:

  • 确保您正在使用.NET服务器端工具来显示/隐藏字段。如果在服务器端将字段的Visible属性设置为false,则呈现的页面甚至不会在HTML中包含该字段。相比之下,添加样式或使用JavaScript来隐藏属性会将它们保留在DOM和HTML中,这样人们就可以“查看源代码”来查看以这种方式隐藏的字段。
  • 从不使用客户端代码来实现安全性。可以拒绝、禁用和/或操纵JavaScript、ActiveX控件等。显示数据的客户端代码还要求数据位于页面源中的某个位置,这意味着通过查看页面源可以很容易地找到数据。
  • 出于同样的原因,不要相信不可编辑的字段不会更改其数据。
  • 如果你从所有不可见的/禁用的东西开始,并使它们可见/启用,你的代码将会比你开始时广泛开放的访问和隐藏的东西更安全。如果你忘记隐藏一些新的东西,客户会突然看到一个他们不应该接触的新领域。如果您忘记添加代码以根据权限显示新字段,您仍然需要修复它,但利用不存在的字段要困难得多,甚至不可能。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5184202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档