2

Sinatra フレームワークを使用して、ログイン用のセッションを必要とする非常に単純な Web アプリを作成しています。

私は問題なくログインできますが、友人がサイトにアクセスすると、私としてログインします。友達登録してもらいました。サイトに再度アクセスすると、彼女としてログインしていました!! 私たちはさまざまなデバイスで 3000 マイル離れています。

これが私のログインコードの要点です..

require 'rubygems'
require 'sinatra'

# I have tried enabling/disabling the :session_secret
# set :session_secret, 'my_secret' 
enable :sessions

before '*' do
  begin
    User.login(User.find(session[:me])) if session[:me]
  end
end

post '/login' do
  user = User.find_by_email!(params[:email]).authenticate!(params[:password])
  session[:me] = user.id
  User.login user
  200
end

これをラックアップファイルに追加してみました

use Rack::Session::Cookie, 
    :key => 'my_app_key',
    :path => '/',
    :expire_after => 14400, # seconds
    :secret => 'secret_stuff'

この問題は、本番環境と開発環境の両方にあります。

Sinatra のドキュメントでは、 http: //www.sinatrarb.com/faq.html#sessions 以外の構成は推奨されていませんenable :sessions

4

1 に答える 1

6
User.login(User.find(session[:me])) if session[:me]

class User
  def self.login(user)
    @@me = user
  end
end

これがあなたの問題です。クラス変数は、リクエスト間でも保持されます。

  1. ログインします
  2. User @@meユーザーに設定されます
  3. 他の誰かがサイトにアクセスします。
  4. session[:me]nilまだセッションがないためです
  5. User.loginは呼び出されずUser @@me、ユーザーまたは nil に設定されます。

したがって、 がない場合はsession[:me]変更User @@meされません。

つまり、クラス変数を使用して、単一のリクエストに対してのみ保持する必要がある情報を保存しないでください

于 2013-01-03T20:18:46.647 に答える