2016-11-17 8 views
2

私はWebアプリケーションにPyramidsを使用しています。これは、各要求に対してcsrfチェックが必要です。 ajax-callsの間、csrf-tokenは各要求のヘッダーに設定されます。すべてが1労働者1スレッドの罰金に動作しますが、できるだけ早く私は、複数の労働者を有効にすると、作業員2つのdoes'tは、労働者1どのようにすることができますが、彼らシェア CSRFトークンからトークンを知っていますか?ピラミッドの複数のgunicornワーカーでCSRFを確認する

挨拶

gunicornためproduction.ini:私はのみ設定ピラミッドで

[server:main] # GUNICORN 
use = egg:gunicorn#main 
bind = unix:/tmp/gunicorn.sock 
workers = 2 
threads = 1 
preload = true 
reload = true 
accesslog = gunicorn_access.log 
loglevel = info 

config.set_default_csrf_options(require_csrf=True) 

マイHTML-skeletionがあります

<input type="hidden" id="hidden_csrf_token" name="csrf_token" value="${request.session.get_csrf_token()}"> 

ごとajax-request:

var csrf_token = $('#' + hiddenCSRFTokenId).val(); 
... 
headers: {'X-CSRF-Token': csrf_token} 

編集:私はビーカーを使用していたこれにより、私は

session_factory = session_factory_from_settings(settings) 
... 
config.set_session_factory(session_factory) 

ようデフォルトセッションファクトリを使用しています:設定中

# Beaker cache 
beaker.cache.regions = short_term, long_term 
beaker.cache.type = memory 
beaker.cache.short_term.expire = 3600 
beaker.cache.long_term.expire = 86400 

# Beaker sessions 
beaker.session.type = redis 
beaker.session.data_dir = %(here)s/data/sessions/data 
beaker.session.lock_dir = %(here)s/data/sessions/lock 
beaker.session.autor = true 
#beaker.session.type = memory 
beaker.session.key = dbas_prototyp 
beaker.session.secret = ... 
beaker.session.cookie_max_age = 3600 
beaker.session.timeout = 3600 
beaker.session.cookie_expires = true 
beaker.session.url:127.0.0.1:4284 

は、私が何かを逃しましたビーカー?

+0

CSRFトークンはセッションによって与えられます。セッションをどのように設定しましたか?異なる作業者がセッションデータをどのように共有していますか? –

+0

編集と追加のコードを作成しました。 –

答えて

0

私は最初の解決策が見つかったと思います。他のいくつかの問題が修正された後、私は、Redisのと解決策を投稿します

session.url = postgresql+psycopg2://user:password&@localhost:port/database?client_encoding=utf8 

# Beaker cache 
beaker.cache.regions = short_term, long_term 
beaker.cache.type = ext:database 
beaker.cache.short_term.expire = 3600 
beaker.cache.long_term.expire = 86400 
beaker.cache.extend_existing = True 
beaker.cache.table_name = beaker_cache 

beaker.session.type = ext:database 
beaker.session.key = yyy 
beaker.session.secret = xxx 
beaker.session.cookie_max_age = 3600 
beaker.session.timeout = 3600 
beaker.session.cookie_expires = true 
beaker.session.table_name = beaker_session 

:私のような、シンプルで外部データベースとのビーカーを使用しています。

0

beaker.cache.type=memoryは、セッションデータ(私の推測)のインプロセスメモリストレージです。あなたは2つの異なるプロセスを実行しており、当然彼らは互いのメモリスペースを見ることができません。

pyramid_redis_sessionなどの異なるBeakerバックエンドを使用して、プロセス(およびサーバー)間でセッションデータを共有します。

+0

音が論理的に正しい。私は、キャッシュの種類がファイルとして設定されている修正プログラムを試しても動作しません。私はredisに近く見て、ここにフィードバックを与えるつもりです。 –

関連する問題