2010-12-14 132 views
4

我正在开发一个使用MVC 3(RC2)的CMS应用程序,现在我处于十字路口。如果我提出的方法是适当的,我无法说服自己。我想这是因为我知道我正在试图削减一些角落,这些角落会让我在晚些时候沉重地付出代价。应用程序逻辑(认证/授权的适当位置)

我会马上下来说明我的问题:

1)我有一个资源(可以称其为A),它必须进行编辑。

2)我有一个自定义的权限系统来实现,其具有2(许多)权限:

  • 可以编辑自己的资源
  • 可以编辑其他资源

3)资源的创造者如果他们有“可以编辑自己的资源”权限,A可以自由编辑。

4)单独的用户只能如果他们有权限编辑“可以编辑其他资源”

现在的需求描述,让我告诉你我的做法至今:

1)I有一个叫做 'ResourceController'

2)我已被称为动作 '修改' 控制器

3)操作有一个属性在其上:[CustomerAuthorize(Perm.CanEditOwnResource,Perm.CanEditOtherResource,不限=真) ]

4)我有一个服务类负责域验证。

因此,如果用户具有“可以编辑自己的资源”或“可以编辑其他资源”权限,则用户可以调用操作方法。

我该如何决定(以及在何处作出此决定)关于用户是否拥有正确的权限(取决于他们是否拥有资源?)如果它在控制器操作中,则在资源服务类中,在一个单独的服务类?

等着听不同意见......

回答

2

由于MVC的本质,您会希望在各种各样的点上进行身份验证检查。

其中之一,你需要能够在用户界面上显示视觉提示(即显示编辑按钮或不显示它),所以逻辑必须提供给你的视图。

当然,这仅用于UI目的。您还需要对控制器操作进行身份验证/授权,以防万一有人绕过您的UI访问它。

最后,执行验证和授权操作的最安全的地方就在您执行之前。例如,如果你有一个处理程序,我会在那里放置一些授权逻辑。您希望确保没有人能够通过从其他地方调用服务来编写您的安全逻辑,并且不知道该服务存在限制。这有助于使安全选项更加细化。

+0

但不是重复的逻辑?重复多次相同的检查?但我理解你的关心。我想知道是否可以看到一些OSS项目来学习这种模式。 – kidoman 2010-12-14 20:01:16

+0

@ KiD0M4N:有些情况下重复某些逻辑比不重复它更容易(包括长期维护考虑)。也就是说,有时候技术限制或现有的设计决策使得追求完全纯粹的“不要重复自己”是不合理的。 – 2010-12-14 20:27:23

0

一种方式接近它是有2个动作,而不是唯一的“编辑”,你有“EditOwnResource”和“EditOtherResource”。然后您可以在每个这些上放置一个权限。

然后,如果您使用的是MVVM模式,则可以将这些操作的可用性绑定到一个ownResource或otherResource。这些值的设置在视图模型中完成。

+0

我正在使用ASP.NET MVC。所以MVVM位不适用。但我会考虑有两个单独的前台行动。但它可能不会在我的具体情况下 – kidoman 2010-12-14 20:04:49