2011-03-03 36 views
0

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

即使Aldeel的答案有效,它似乎并不是我最好的解决方案。我会解释为什么。

我会尽力解释什么,我需要非常详细和hopefuly一些,你将能够帮助我:d

我需要表现出不同的看法,但它不只是这样。每个用户都可以访问页面的不同部分。

我举一个例子:

想象一下,一个页面的“X”这个结构

Field A 
Field B 
Field C 
Field D 

当用户U1从组G1访问页X系统检查DB该组的权限上页面X。用户U1可以看到Field AField B,但只能编辑Field A

用户U2设置为无组访问页面X。系统检查他的权限页X。用户U2可以查看和编辑所有字段。

当来自组G2的用户U3访问页面X时,系统检查数据库中该组的权限X。用户U3可以看到Field CField D,但不能编辑任何。

我希望这是很容易理解...

我coudn't找到一个方法来做到这一点,而不是有很多关于特定用户的许可数据填充的ViewData的。在我的例子中只有4个字段,但在我目前的项目中,我没有少于20个字段的屏幕。所以我想你可以看到这是多么丑陋和没有生产力。

这个想法与社交网络类似,正如我所说(facebook example)。当访问UserX页面的用户只能看到UserX允许他访问的内容。

我真的很感激任何帮助。

此致敬礼。

回答

4

要做你想要做的事,你不应该控制你的观点 - 你实际上必须保护你的控制器 - 而不是观点。你可以通过控制器属性来完成。类似的东西:

[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团队做了很好的设置,你不必单独检查控制器中的权限。我希望这有助于你开始。在线搜索有关如何使用授权属性的更多信息。

更新 在你谁是控制这些权限页的管理员的情况下,你必须要聪明的你如何设置你的授权属性。这就是“角色”非常重要的地方(根据我上面的例子)。例如,如果管理员说:“我要将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,因此该视图甚至无法显示。 (您可以在您的控制器中查看。)

希望澄清事情!我正在运行,所以现在我无法再扩展它。

+0

@JasCav谢谢你的回答。我已经在使用[Authorize]属性。不像你特别说的那样。我只用它来防止未经授权的访问。但是,除非我不能完全理解它是如何工作的,否则还有另一个问题。该权限将由该特定页面的adm设置(这就是为什么我使用了Facebook的示例)。我无法看到他希望别人看到而不是检查数据库。我怎样才能返回一个特定的局部视图?用户可以拥有字段a和b的权限,或者只有c或任何其他权限。您的解决方案适用于这种情况吗?再次感谢。 – eestein 2011-03-03 17:53:45

+0

@eestein - 我的解决方案可以适用于您所描述的情况,假设它已正确设置。我现在正在写一个更新到我的答案 - 一会儿找。 – JasCav 2011-03-03 18:02:02

+0

@JasCav谢谢,我会等。 – eestein 2011-03-03 18:05:00

1

我会推荐“添加剂”安全;一个用户的权限和他的任何一个组的权限,总共可以给他一系列允许他做的事情。如果他没有明确的许可要求做某些事情需要许可,他不允许这样做。在你的情况下,在User U1和Group G1之间,有足够的权限授予用户查看字段A和字段B并编辑字段A.由于用户自己或通过他们的组未被明确授予编辑字段B或查看或编辑字段C和D,他没有这些权限。

我将通过在代码隐藏中放置一个方法来实现这种类型的权限,该方法将接受代表用户及其权限的对象,并询问这些权限以确定字段的可见性。所有字段都应以不可见的方式出现,并且此方法将使其可见和/或可编辑。

事情需要注意的:

  • 确保您使用的是.NET服务器端工具来显示/隐藏字段。如果在服务器端某个字段的Visible属性设置为false,则呈现的页面甚至不会在HTML中包含该字段。相比之下,添加样式或使用JavaScript来隐藏属性会将它们保留在DOM中,并且保存在HTML中,因此用户可以“查看源代码”来查看以这种方式隐藏的字段。
  • 切勿使用客户端代码来实现安全性。 JavaScript,ActiveX控件等可以被拒绝,禁用和/或操纵。显示数据的客户端代码也要求数据位于页面源代码的某处,这意味着通过查看页面源代码可以很容易地找到它。
  • 出于同样的原因,不要相信不可编辑的字段不会更改其数据。 HTML和客户端代码,可以使用FireBug等工具轻松更改。
  • 如果您从一切看不见/禁用,并使其可见/启用,您的代码将更安全,如果你开始以开放的访问和隐藏的东西。如果你忘记隐藏新的东西,所有突然的客户都会看到一个他们不应该碰触的新领域。如果您忘记添加代码以显示基于权限的新字段,则仍然需要修复它,但是利用不存在的字段更难或不可能。
相关问题