2009-05-20 62 views
1

我有一个我正在构建的系统,似乎需要一些复杂的规则,而不是在整个系统中混乱的规则。我期待集中整个过程。 (这可能不是我所拥有的最聪明的主意)如何在Ruby on Rails中实现复杂的安全规则

我最(也许是最不重要的)想法是在保存到数据库之前使用单独的类来检查任何对象,并将其与各种字段中的允许值列表。它非常紧密地绑定到数据库结构上,而且易于测试和易于维护。规则

例子:

  • 主持人可以提出意见与主持人状态,但没有管理的状态。
    • Comments.status只能是正常或管理员(admin是保留给管理员)
  • 用户不能修改意见主持人值
    • Comments.status只能是正常,Comments.display只能是正常
  • 只有管理员才能暂停用户帐户众多领域的
    • 列表
  • 只有管理员可以修改其他用户帐户对与逻辑域
    • 限制,以确定当前用户拥有的行
  • 只有付费帐户的用户才能执行X,Y和Z.

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

如果我遵循这一行动的过程,实施将是讨厌的。现在,我看着这样的事情

#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 

这是会很快成为维护的噩梦。这是我梦寐以求的梦魇的替代选择。在我编码之前,我停下了脚步。

+0

可能有助于解释为什么这太复杂的验证,这似乎是一个明显的答案。 – kajaco 2009-05-20 22:44:06

+0

我想我认为使用安全验证会混合逻辑,我不想混合。也许这不是我认为会是的问题。 – epochwolf 2009-05-21 00:26:34

回答

0

你为什么不创建一个Permissions模型,然后只需如果user.permissions.find(:permission_name_here)看到当你设计验证和意见?