12

何らかの理由で、モデルレス コントローラー ( ) でcurrent_user返されます。インターネット上でこの動作を正当化するものは何も見つかりませんでした...nilSubscriptions

class SubscriptionsController < ApplicationController  
  def new
    ...
  end

  def create
    current_user    # returns nil
  end
end

私はcsrfメタタグを持っています:

<meta content="xxx" name="csrf-token">

もっと多くのコードを提供できますが、何が役立つかわかりません。

アップデート

コメント/回答のおかげで、問題を1つの特定のアクションに特定しました: create.

に追加@user = current_userするとnew、現在のユーザーのメールをnewビューに表示できます。ただし、私のcreateコントローラーでは、 をcurrent_user返しますnil

createフォーム (送信) からアクションにアクセスしました。

フォームが送信される前に、入力を検証してから、Stripe にリクエストを送信して、フォームからトークンを取得します。エラー (検証とストライプ) がなければ、フォームを送信します。

それが原因でしょうか?

更新 2

エラー メッセージでは、セッション ダンプがですが、current_user 情報が含まれているはずです...

4

4 に答える 4

12

私が作成していた AJAX リクエストに CSRF トークンが含まれていないことが判明しました。そのため、Rails は私のセッションを殺していました。

私に追加skip_before_filter :verify_authenticity_tokenしましたSubscriptionsControllerが、現在は機能しています。これは最も安全なソリューションではないかもしれませんが、今のところ機能しているため、開発を続けて、後でこの問題に戻ってきます.

于 2013-08-25T19:45:25.267 に答える
5

form_tagヘルパーを使用してフォームを作成すると、CSRF 認証のトークンを保持する隠しフィールドが自動的に生成されないことに注意してください。を使用して作成したフォームで、この同じ問題に遭遇しましたform_tag

フォーム内に次のヘルパーを含めることで問題を修正しました。

<%= hidden_field_tag 'authenticity_token', form_authenticity_token %>

これは基本的に、CSRF に必要な隠しフィールドを手動で生成する方法です。

于 2014-01-29T16:53:15.383 に答える
1

同様の問題がありましたが、モデルを編集していました。したがって、モデルを突然更新するたびに、次のことが起こります。

current_model to nil

分析の結果、パスワードをフォームに残しておくと、ユーザーが何らかの属性を編集しようとすると、パスワードの書き込みを強制されることが判明しました。
フォームが配信されて更新されると、誰かがパスワードを更新すると、Devise は合理的なことを行います。つまり、セッションを破棄し、ユーザーに再度サインインするように求めます。

current_modelそれが突然ゼロになった理由です。これがお役に立てば幸いです。素晴らしい一日を!

于 2019-02-05T22:29:21.433 に答える