2016-11-17 93 views
2

我为我的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 

难道我错过了一些东西,同时设立烧杯?

+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一个更仔细的看看,并在这里给予反馈。 –