混合处理模型中安全逻辑的代码是不好的设计?
在before_save回调中编辑页面的示例
current_user
方法中获取当前用户。current_user.has_permission? :edit_page
为假,则抛出异常editor_id
设置为current_user.id
该模型不是应用程序中唯一的安全检查。用户界面在显示编辑视图之前检查权限。该模型可以阻止视图/控制器级别中的任何错误。
注意:模型和控制器级别之间唯一的缺点是current_user
方法。我正在处理的应用程序永远不会允许匿名用户。
答案 0 :(得分:4)
MVC框架中的模型应该完全包含您的所有业务逻辑。在一个设计良好的MVC应用程序中,至少在理论上,您应该能够在不同的上下文中重用您的模型,而无需重新实现任何业务逻辑。
在每种情况下,我都可以认为授权,输入验证和审核日志 非常肯定是业务逻辑,因此应该在您的模型中处理。
另一方面,我认为身份验证,加密,加密哈希等不是模型的一部分。安全性的这些方面不是核心业务逻辑的一部分,它们通常是应用程序接口的一部分。
答案 1 :(得分:3)
我不认为将安全逻辑放在模型中是不好的设计。您将业务逻辑放在那里,您可以将安全逻辑视为一种业务逻辑。您当然不希望在控制器或视图中全部使用,您希望遵循skinny controller, fat model方法。
您的模型应该是独立的应用逻辑块。您应该能够从Rails控制台完全驱动您的模型。此外,在模型中使用安全逻辑可以更容易进行单元测试。
答案 2 :(得分:1)
我想说这取决于您的模型是否可以直接访问。如果是,那么肯定应该通过mixin意识到安全问题,因为这些问题可能与模型的主要问题有些正交。
如果模型应该是不可见的,并且你的控制器中已经有了安全逻辑,那么我就会让模型独自存在。