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

5

ここで何が起こっているかについての詳細な記事を作成しました。

Rails 4.1.5 のセキュリティ修正で Model.where(attributes) が壊れる

スニペット:

うわぁ!Rails 4.1.5 では、is_a へのすべてのパラメーターに安全なパラメーターを使用する必要があります。たとえば、Hash から派生したオブジェクトからキーを取得するためにスライスを使用して Model.where を実行していた場合、Rails 4.1.4 から Rails 4.1.5 に移行すると、コードは次のエラーをスローします。

ActiveModel::ForbiddenAttributesError が omniauth_callbacks#facebook で発生しました: 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 に答える