2016-11-17 33 views
2

Я использую Pyramids для своего веб-приложения, для чего требуется проверка csrf для каждого запроса. Во время ajax-вызовов токен csrf устанавливается в заголовок для каждого запроса. Все работает отлично для 1 нить с 1 рабочий, но как только я разрешу нескольким работникам, работник 2 не знает токен от работника 1. Как они могут поделиться токены csrf?Проверка CSRF с несколькими рабочими-оружейниками в Pyramid

Приветствия

production.ini для gunicorn:

[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-запрос:

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

Edit: Я использую по умолчанию сессионный завод как

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

Сделано редактирование и добавленный код, thx. –

ответ

0

Я думаю, что я нашел первое решение, которое работает. Я использую мензурку с простыми и внешней базой данных, как:

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 

я выложу решение с Redis, после того, как некоторые другие проблемы устранены.

0

beaker.cache.type=memory - это память в процессе хранения данных сеанса (моя догадка). Вы выполняете два разных процесса, и, естественно, они не могут видеть пространства памяти друг друга.

Используйте разные бэкэндеры Beaker или что-то вроде pyramid_redis_session для совместного использования данных сеанса через процессы (и серверы).

+0

Звучит логически правильно. Если я испробую исправление, в котором тип кеша задается как файл, он не будет работать. Я дам redis более пристальный взгляд и собираюсь дать обратную связь здесь. –