Rails ActiveRecord 设置数据库只读

linjunhalida · 2015年03月19日 · 最后由 libuchao 回复于 2015年03月20日 · 2364 次阅读

需求是这样的:Rails 需要访问另外的数据库来查询资料,为了保证安全,希望可以设置数据库只读,但是同时在一些特殊情况下要可以更新部分数据。

连接数据库的用户可以设置成只读用户,但是这样不能在有需要的时候写入数据了。数据库 Adapter 也没有设置成只读的功能。

有一个思路,就是 hack adapter,设置只能够发送 select 语句,其他的都过滤报错,只有在手动开启开关的时候才可以发送其他语句。

不知道大家怎么看?

这个是否可以考虑用数据库的 master slave 来做呢?不知道 activerecord 有没有类似的扩展。 https://github.com/tchandy/octopus https://github.com/bdurand/seamless_database_pool 这两个 gem 应该都可以实现

  • 给 Rails 配一个只读的数据库用户 User_A。
  • “一些特殊情况下”用另外一个可写入的数据库用户 User_B,另外新建一个 db_connection

ActvieRecord 里可以把 model 设置成 readonly 的,参考代码:

# Make model readonly

module ModelReadonly
  extend ActiveSupport::Concern

  included do
    before_destroy :can_not_destroy
  end

  def readonly?
    true
  end

  def can_not_destroy
    raise ActiveRecord::ReadOnlyRecord, 'data is readonly.'
  end  
end
class MyModel < ActiveRecord::Base
   include ModelReadonly
end

需要 打开写的时候,建立一个新的 model,写操作用这个新 WriteModel

class WriteModel < MyModel
    self.table_name = "my_models"
    def readonly?
      false
    end

    def can_not_destroy
    end
end

cookpad 自己开发了switch_point插件来做读写分离 https://github.com/eagletmt/switch_point

需求无穷 智慧无穷

用 view 来操作只读是否可行呢

#7 楼 @ywjno 不可行吧,用户可以对 view 随意更改,服务端一定需要对权限二次检测。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号