将安全逻辑与Ruby on Rails中的模型混合使用?

时间:2009-04-19 18:22:44

标签: ruby-on-rails security model

混合处理模型中安全逻辑的代码是不好的设计?

在before_save回调中编辑页面的示例

  • 从Controller层中的current_user方法中获取当前用户。
  • 如果current_user.has_permission? :edit_page为假,则抛出异常
  • editor_id设置为current_user.id
  • 更改记录在单独的表中

该模型不是应用程序中唯一的安全检查。用户界面在显示编辑视图之前检查权限。该模型可以阻止视图/控制器级别中的任何错误。

注意:模型和控制器级别之间唯一的缺点是current_user方法。我正在处理的应用程序永远不会允许匿名用户。

3 个答案:

答案 0 :(得分:4)

MVC框架中的模型应该完全包含您的所有业务逻辑。在一个设计良好的MVC应用程序中,至少在理论上,您应该能够在不同的上下文中重用您的模型,而无需重新实现任何业务逻辑。

在每种情况下,我都可以认为授权,输入验证和审核日志 非常肯定是业务逻辑,因此应该在您的模型中处理。

另一方面,我认为身份验证,加密,加密哈希等不是模型的一部分。安全性的这些方面不是核心业务逻辑的一部分,它们通常是应用程序接口的一部分。

答案 1 :(得分:3)

我不认为将安全逻辑放在模型中是不好的设计。您将业务逻辑放在那里,您可以将安全逻辑视为一种业务逻辑。您当然不希望在控制器或视图中全部使用,您希望遵循skinny controller, fat model方法。

您的模型应该是独立的应用逻辑块。您应该能够从Rails控制台完全驱动您的模型。此外,在模型中使用安全逻辑可以更容易进行单元测试。

答案 2 :(得分:1)

我想说这取决于您的模型是否可以直接访问。如果是,那么肯定应该通过mixin意识到安全问题,因为这些问题可能与模型的主要问题有些正交。

如果模型应该是不可见的,并且你的控制器中已经有了安全逻辑,那么我就会让模型独自存在。