【问题标题】:How to implement complex security rules in Ruby on Rails如何在 Ruby on Rails 中实现复杂的安全规则
【发布时间】:2009-05-20 22:40:55
【问题描述】:

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

我最(也许最不)绝妙的想法是使用一个单独的类来检查任何对象,然后再根据各个字段中允许的值列表保存到数据库中。它与数据库结构的绑定非常紧密,但很容易测试和维护。

规则示例:

  • 版主可以提交具有版主身份的 cmets,但不能提交管理员身份。
    • Comments.status 只能是普通或版主(admin 为管理员保留)
  • 用户不能在 cmets 上修改主持人值
    • 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

这将很快成为维护的噩梦。必须有一个替代我梦寐以求的噩梦的方法。我在编码之前停下了自己。

【问题讨论】:

  • 可能有助于解释为什么这对于验证来说太复杂了,这似乎是显而易见的答案。
  • 我想我觉得使用安全验证会混合我不想混合的逻辑。也许这不是我认为的问题。

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


【解决方案1】:

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

猜你喜欢
  • 1970-01-01
  • 2017-08-07
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多