2

ログインおよびログアウトのためにAJAXリクエストをRailsサーバーに送信する(app/views/ではなく)静的なhtmlページを使用するRailsアプリケーションがあります。

ユーザー認証にセッションを使用し、ユーザーがログインするsession[:userid]と設定され、「ログインしました」という応答が静的htmlページに返されます。ただし、ログアウトボタンをクリックしてログインした後session[:userid]nil.

これが私のコードです:

ログインする場合:

  def login
    # code here
    if encrypt(params[:password]) == @user.password # authenticated
      session[:userid] = @user.id
      render :text => 'logged in'
    else # wrong password
      render :text => 'password not correct'
    end
  end

ログアウトする場合

  def logout
    # here session is no longer available  
    session[:userid] = nil  
    render :text => 'logged out'
  end

ログインページ:

    <button id='login_button'>Log in</button>
    <script type="text/javascript" charset="utf-8">
        $('#login_button').click(function() {
            $.ajax({
                type: 'POST',
                url: 'http://localhost:3000/user/login',
                data: { username : $('#login_username').val() , password : $('#login_password').val() }
            }).done(function(data) {
                if (data == 'logged in') {
                    window.location = 'logged_in.html';
                } else {
                    alert(data);
                }
            });
        });
    </script>

ログアウトする場合:

<button id='logout_button'>Log out</button>
<script type="text/javascript" charset="utf-8">
    $('#logout_button').click(function() {
        $.ajax({
            type: 'POST',
            url: 'http://localhost:3000/user/logout',
        }).done(function(data) {
            console.log(data);
        });
    });
</script>

ログインのログ:

Started POST "/user/login" for 127.0.0.1 at 2012-10-12 16:28:46 -0500
Processing by UserController#login as */*
  Parameters: {"username"=>"name", "password"=>"[FILTERED]"}
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE (username = 'name')
Completed 200 OK in 12ms (Views: 0.3ms | ActiveRecord: 0.6ms)

ログアウトのログ:

Started POST "/user/logout" for 127.0.0.1 at 2012-10-12 16:28:50 -0500
Processing by UserController#logout as */*
{} <--------------------------------------- here I printed out session
  Rendered text template (0.0ms)
Completed 200 OK in 1ms (Views: 0.7ms | ActiveRecord: 0.0ms)

クライアントからのAJAXリクエストにセッションを使用できないのは、AJAXの問題ですか?

前もって感謝します。

4

1 に答える 1

5

"protect_from_forgery" を設定していますか? その場合、これが問題の原因です。Rails が Ajax 呼び出しを受け取り、正しい CSRF トークンが見つからない場合、Rails はセッションを閉じます。

保護をグローバルにオフにする代わりに、関連するコントローラーに次のようなものを配置して、静的ページからの呼び出しのいずれかに対してのみ保護をオフにすることをお勧めします。

skip_before_filter :verify_authenticity_token, :only => [:login, :logout]
于 2012-10-12T20:01:09.653 に答える