在视图中使用安全条件是否违反了MVC?


10

通常,显示给用户(例如网页)的内容将部分基于安全检查。我通常将用户级/ ACL安全性视为系统业务逻辑的一部分。如果视图明确检查安全性以有条件地显示UI元素,是否通过包含业务逻辑来违反MVC?


有什么选择?

1
即使某些人认为它是反模式,也要使用能提供最佳安全性的东西。
zxcdw

Answers:


6

可以有两种类型的安全条件,一种在模型上,另一种在视图上。该视图根据当前用户的权限控制相关元素的显示,但是模型控制对基础数据的访问。只要模型具有所有正确的验证/确认,那么即使缺少视图,也仍然具有安全性。

通常,您必须同时拥有两者,因为视图需要针对不同的级别/角色进行更改。控制器发送了将改变视图的相关数据,但是视图仍然需要对该数据进行某些操作以向正确的用户隐藏/显示内容。

这就是为什么大多数模板框架都有条件元素的原因(Handlebars示例):

{{#if isCurrentUserAdmin}}
    ....
{{/if}

因此,只要适当的部分在正确的位置,这并不意味着违反。


4

是的,没有。

如果实际的安全性决定是由视图决定的,那么是的,您违反了MVC。但是,如果视图将实际决策委托给模型,那么您就可以了。基于模型的信息来决定要显示哪些元素的观点没有错。

例如,如果您有一个“编辑”按钮,仅对具有“编辑者”许可权的用户可见,则视图可以询问模型当前用户是谁以及他们是否具有“编辑者”许可权,然后使用此信息来决定是否显示按钮。但是,如果视图本身要执行身份验证和授权逻辑,那么您将违反MVC。


2

我会说没有

但是出于与@rvcoutinho说的原因不同的原因(尽管他引用了维基百科,这使我在思考中感到不对)

我要说的是,给模型的模型应该共享所有相关的安全性问题(这取决于您出于这个原因可能希望使用ViewModel的组合数量),因为您可以为安全性位设置开关。

这允许进行两层安全验证:在UI层,因此对于正常情况颠倒了回发,在服务器层中,对于不良行为者,该模型保留了其内部的安全知识,因此控制器将信息传递给立即将其扔出的模型。

这样的两层安全性是行业中的标准,并且这种方式允许您只需要在两个地方存在安全逻辑,因此这是一个好处,一旦将安全逻辑放入控制器中,就将其放到控制器中, UI和模型中的(模型需要它,因为它是最后一道防线,对于MVC Web应用程序之外的任何使用(例如桌面客户端或任何服务器管理工​​具)尤其重要)


Wikipedia的断言“控制器可以向其关联的视图发送命令以更改视图的模型表示形式”似乎更适合于Model-View-Presenter,因为该短语似乎可以描述交互式模型,而在MVC中,一旦视图将被渲染,在视图和控制器之间不会进行任何进一步的操作。
罗伯特·哈维

1
@RobertHarvey我同意声明不适合我对MVC的定义,但是幸运的是,我们在一个行业中工作,该行业的准确性是由多个协议而不是任何可证明性决定的,因为这些定义就像是从以太币中浮现出来一样。一个不断发展的基础,使每个人都能外卖。或者用更简单的话来说,我可能和这里的其他所有人一样错。
Jimmy Hoffa 2013年

3
这就是为什么我认为人们无论如何都对这种事情过于痴迷。
罗伯特·哈维

1
@rvcoutinho我一点也不会说,我只是个字面意思。您身边有参考,我所得到的只是我的见解,所以在我看来,这意味着我可能错了,这就是为什么我提到它。我觉得我的观点很合理,即使没有参考文献也值得分享,所以无论如何我还是这样做了,不管我说的是什么事实,我都可能错了。
Jimmy Hoffa 2013年

1
@rvcoutinho:实际上,我指的是OP的问题。:)规则没有什么问题,除非规则妨碍了完成工作。
罗伯特·哈维

2

我会说没有

通常,这种安全检查将由控制器进行。

维基百科

控制器可以将命令发送到其关联的视图,以更改模型的视图表示

而且我认为不应直接在视图中完成。例如,如果通过javascript完成,则可能是一个安全问题(可以禁用javascript并访问优先数据)。

再次,来自维基百科

视图从模型中请求生成输出表示所需的信息。


1
在许多软件系统中,元素的显示取决于用户的安全级别。尽管可以通过在视图模型中将数据项设置为零或null来禁止显示该数据项,但仍会显示该数据项的名称或描述。可以(实际)禁止显示数据项描述的唯一位置是在视图中。
罗伯特·哈维

我倾向于不同意。我会说视图将请求数据,控制器将操纵模型,然后视图将再次表示它。该视图应仅负责输出的表示形式。
rvcoutinho

这就是为什么视图需要隐藏用户不需要查看的那些视觉元素的原因。财务负责人不负责创建数据的视觉表示;视图是。当然,如果您显示的内容非常敏感,甚至无法显示在“视图/源”中,那么控制器需要做的就是返回一个不同的视图。
罗伯特·哈维

1
这就是我的意思。观点应该不同。据我了解,看起来视图仅应处理数据的表示形式。用表示法,我指的是如何展示某种东西,而不是何时展示它。但是您的评论是完全相关的。
rvcoutinho

好吧,我认为我们可能只是对两个不同的事物使用相同的表达式。无论如何,有什么不同的看法?但是我认为我们同意最重要的事情:如果它是安全敏感的,则不应由视图来处理。
rvcoutinho

1

这个问题涉及几个问题。

  1. 认证(是这个用户他说他是谁)应不会是查看关注的问题。
  2. 授权(是否允许当前用户执行此操作 View关心的问题,因为它会影响向用户呈现的内容。因此,用于显示编辑按钮的代码可以用条件包围if model.userCanEdit() ... endif
  3. 确定用户具有哪些授权属性,即业务逻辑,应将其放置在模型中。(例如,“编辑”特权要求您具有2000声誉;或者您必须是作者或主持人)

0

如果只显示UI元素,我认为还可以(您还怎么做?)。如果这些元素中有任何数据,则模型应确保容器为空。当然,获取许可权数据的代码应该在视图之前进行处理,因此这里没有对模型的有效访问。


0

如果视图明确检查安全性以有条件地显示UI元素,是否通过包含业务逻辑来违反MVC?

是的,它违反了MVC。

该视图仅用于显示元素,逻辑应在模型中。通过使视图执行某些操作(在您的情况下,请检查安全性),就可以在其中放置逻辑。


然后,视图如何知道是否显示诸如编辑按钮之类的内容?
Matt S

@MattS演示者在视图中调用一个函数以显示或隐藏该按钮(取决于模型中的状态)。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.