Rails 4.1.5 omniauth强参数

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

路线:

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

Session#创建控制器:

  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问题还是两者兼而有之?

替换你当前的发现者:

 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 

我创建了一个关于这里发生的事情的详细文章:

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

片段:

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

omn​​iauth_callbacks中出现ActiveModel :: ForbiddenAttributesError #facebook:ActiveModel :: ForbiddenAttributesError

我的解决方案是这样的。

 # 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 

如果您难以将哈希值分隔为键值集,则可以使用这种方式。