如何在Ruby on Rails中实现复杂的安全规则

时间:2009-05-20 22:40:56

标签: ruby-on-rails security model-view-controller

我有一个我正在构建的系统似乎需要一些复杂的规则,而不是在系统中有一堆乱七八糟的规则。我希望集中这个过程。 (这可能不是我最聪明的想法)

我最大的(也许是最不好的)想法是使用一个单独的类来检查任何对象,然后根据各个字段中的允许值列表保存到数据库。它与数据库结构紧密相关,但易于测试且易于维护。

规则示例:

  • 版主可以提交具有版主状态但不是管理员状态的评论。
    • Comments.status只能是普通用户或管理员(管理员为管理员保留)
  • 用户无法修改评论的版主值
    • Comments.status只能是正常的,Comments.display只能是正常的
  • 只有版主可以暂停用户帐户
    • 众多字段列表
  • 只有版主才能修改其他用户帐户
    • 限制哪些字段具有逻辑以确定当前用户是否拥有该行
  • 只有拥有付费帐户的用户才能执行X,Y和Z。

我遇到的问题是我在哪里放这个逻辑。它对于rails验证来说太复杂了。如果我只查看登录用户的状态,则很难或不可能实现其中一些规则。当前的解决方案是创建一个Security类,它将接受数据库对象和用户,并允许或禁止该操作发生。

如果我遵循这个行动方案,实施将是令人讨厌的。现在我正在看这样的事情

#For every field on an object passed to Security::allow?(user, object), call this private method
def allow_helper?(user, object, field) 
    perm = permissions[user.rank][object.class.name][field] 
    if perm.is_a? Array
          perm.include? object.send(field)
    else
          perm

这将很快成为维持的噩梦。除了我梦寐以求的梦魇,我必须有另一种选择。在我编码之前我停了下来。

1 个答案:

答案 0 :(得分:0)

为什么不创建Permissions模型,然后在设计验证和视图时查看是否user.permissions.find(:permission_name_here)