在Pyramid中用多个gunicorn工人检查CSRF
问题描述:
我为我的web应用程序使用金字塔,这需要对每个请求进行csrf检查。在ajax调用期间,csrf令牌被设置为每个请求的头部。一切正常的1线程与1工人,但只要我允许多个工人,工人2开不知道,从工人1,他们如何份额的CSRF令牌,令牌?在Pyramid中用多个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请求:
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
难道我错过了一些东西,同时设立烧杯?
答
我认为我找到了第一个解决方案。我使用的烧杯中的简单和外部数据库,如:
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的一个解决方案,其他的一些问题,在修复后。
答
beaker.cache.type=memory
是会话数据(我的猜测)的进程内存储。你正在运行两个不同的进程,当然他们看不到对方的内存空间。
使用不同的Beaker后端或类似pyramid_redis_session的东西来跨进程(和服务器)共享会话数据。
+0
声音在逻辑上正确。如果我尝试一个修补程序,其中缓存类型设置为文件,它将无法工作。我会给Redis一个更仔细的看看,并在这里给予反馈。 –
CSRF令牌是由会话给出的。你如何设置你的会议?工作人员如何分享会话数据? –
进行编辑并添加了代码thx。 –