19

将 Rails 4.1.4 升级到 4.1.5 后,我的 facebook omniauth 会话出现错误,此后一切正常。当我创建一个用户会话时,我得到一个ActiveModel::ForbiddenAttributesError

路线:

  match 'auth/:provider/callback', to: 'sessions#create', as: 'signin', via: :get

会话#创建控制器:

  def create
        user = User.from_omniauth(env["omniauth.auth"])
        session[:user_id] = user.id 
        session[:user_name] = user.name

      redirect_to root_path
  end

和这样的用户模型:

  def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid)).first_or_create.tap do |user|
      user.provider ||= auth.provider 
      user.uid = auth.uid
      user.name = auth.info.name
      user.save
    end
  end

我可以通过添加许可来绕过 ActiveModel 错误!我的用户模型中的方法是这样的:

where(auth.slice(:provider, :uid).permit!).first_or_create.tap do |user|

但它覆盖了数据库中的第一个用户......session[:user_id]似乎总是数据库中的第一个用户。

我不知道这是一个强参数问题、Omniauth 问题还是两者兼而有之?

4

3 回答 3

57

替换您当前的查找器:

def self.from_omniauth(auth)
  where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
    user.provider = auth.provider 
    user.uid      = auth.uid
    user.name     = auth.info.name
    user.save
  end
end
于 2014-08-22T19:26:00.367 回答
5

我详细记录了这里发生的事情:

Rails 4.1.5 安全修复中断 Model.where(attributes)

片段:

哎呀!Rails 4.1.5 要求您对 is_a 的任何参数使用安全参数。Hash 例如,如果你在 Model.where 中使用 slice 从 Hash 派生的某个对象中取出一些键,那么当你从 Rails 4.1.4 迁移到 Rails 4.1.5 时,你的代码会抛出这个错误:

在 omniauth_callbacks#facebook: ActiveModel::ForbiddenAttributesError 中发生 ActiveModel::ForbiddenAttributesError

于 2014-10-20T00:27:07.663 回答
0

我的解决方案是这样的。

# extend the object and add method
auth_hash_extended = auth.slice(:provider, :uid)
def auth_hash_extended.permitted?()
  true
end

where( auth_hash_extended ).first_or_create do |user|
    user.provider = auth.provider
    #blablabla
end

如果你很难将散列分成键值集,你可以使用这种方式。

于 2015-02-16T18:29:14.987 回答