ruby-on-rails – Rails 3基于用户权限的ActiveRecord验证

我正在将内置于非标准定制 PHP框架中的应用程序的代码转换为Ruby on Rails(版本3).在PHP版本中,所有的控制器都非常的胖,瘦的机型,我一直都不同意,所以我喜欢Rails在模型级别进行验证的方式,这大概是这些胖控制器发生的90%目前.

我所面对的一个问题,不确定如何解决,而不同的验证规则是基于谁在改变模型的.例如,管理员或记录的原始创建者应该能够像标记一个记录一样删除(软删除),而其他人都不应该这样做.

class Something < ActiveRecord::Base
  ...
  validates :deleted,:owned_by_active_user => true
  ...
end

class OwnedByActiveUserValidator < ActiveModel::EachValidator
  validate_each(record,attr_name,attr_value)
    # Bad idea to have the model know about things such as sessions?
    unless active_user.admin? || active_user.own?(record)
      record.errors.add :base,"You do not have permission to delete this record"
    end
  end
end

由于模型本身(理论上)不知道正在做出改变的用户,所以做这种事情的“轨道”是什么?我应该将活动用户设置为记录上的虚拟属性(实际上不保存到DB),还是应该在控制器中执行这些检查?我不得不承认,模型检查活动用户的权限感到奇怪,并且在测试模型时增加了复杂性.

我渴望在模型中保持尽可能多的一个原因是因为我想提供一个API(通过OAuth访问)和一个网站,而不会重复太多的代码,例如这些类型的权限检查.

解决方法

处理授权或将委托授权授权给授权层确实是控制器的工作.模型不应该知道,也不必关心谁当前登录,他/她的权限是什么 – 这是控制器的工作,或者控制器代理的任何助手层.

您应该:通过new,create或update_attributes删除in-attr_accessible进行大量分配.控制器应分别检查认证用户的授权,如果经过验证的用户被授权,则分别呼叫删除=.

有许多授权库和框架可以帮助授权或作为授权层(如cancan).

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...