代码之家  ›  专栏  ›  技术社区  ›  epochwolf

如何在RubyonRails中实现复杂的安全规则

  •  1
  • epochwolf  · 技术社区  · 15 年前

    我正在构建的一个系统似乎需要一些复杂的规则,而不是在整个系统中有一大堆规则。我想把整个过程集中起来。(这可能不是我最聪明的想法)

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

    规则示例:

    • 版主可以提交具有版主状态但不具有管理员状态的评论。
      • comments.status只能是normal或ordinator(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
    

    这很快就会变成一场噩梦。除了我梦见的这场噩梦,一定还有别的选择。在我编写代码之前我停了下来。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Tim Sullivan    15 年前

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