繁体   English   中英

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

[英]How to implement complex security rules in Ruby on Rails

我有一个正在构建的系统,该系统似乎需要一些复杂的规则,而不是整个系统中都杂乱无章的规则。 我一直在寻求集中化流程。 (这可能不是我所拥有的最聪明的主意)

我最(也许最少)的绝妙想法是使用一个单独的类来检查任何对象,然后再将它们保存到数据库中,以获取各个字段中允许值的列表。 它与数据库结构极其紧密地绑定在一起,但易于测试和维护。

规则示例:

  • 主持人可以以主持人身份而非管理员身份提交评论。
    • Comment.status只能是普通或主持人(admin保留给管理员使用)
  • 用户无法修改评论者的主持人值
    • 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

这将很快成为一场噩梦。 我梦up以求的噩梦必须有另一种选择。 在编码之前,我停下了脚步。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM