2012-01-04 94 views
0

默認情況下,Cookie在會話結束時過期,因此用戶在關閉瀏覽器後每次都需要登錄。但remember選項怎麼樣 - 如何設置沒有到期日期的cookie?我試圖在development.ini文件中添加session.cookie_expires = False,但它沒有幫助。如何設置沒有過期日期的cookie以及如何設置自定義cookie標頭?

還有一個問題:如何設置自定義cookie頭(例如lang到主要cookie沒有過期日期)?

編輯:

我發現max_age parametr在pyramid.authentication.AuthTktAuthenticationPolicy,它可以讓您保存會話之間的cookie。但如何在max_age定義它在__init__.py(config)文件中並且remember me必須定義在登錄視圖中時如何實現remember me複選框?

+0

您是否在問如何更改會話cookie的到期?如果是這樣,你需要告訴我你正在使用的會話工廠。 – 2012-01-04 22:55:47

+0

'pyramid_beaker.session_factory_from_settings'和'session.type = cookie' – 2012-01-04 23:01:03

+0

燒杯的cookie默認爲永不過期,所以也許你正在調試錯誤的東西? – 2012-01-04 23:04:36

回答

3

「記住我」背後的想法是,它是一種持續登錄和會話之間的選項。這最好作爲一個單獨的cookie來實現,如果用戶選中該框,則可以設置該Cookie。如果「記住我」意味着如果策略已過期,則應用程序應該將您重新登錄,然後只保存一個永不過期的簽名cookie。然後,當應用程序因用戶未登錄而引發HTTPForbidden時,可以檢查cookie,看到他們想要被記住,將它們重新登錄並將其重定向到他們試圖去的地方。這只是一個選擇,取決於你「記住我」的意思。

配置金字塔的默認會話工廠

如果您使用的是UnencryptedCookieSessionFactoryConfig會話工廠,則需要通過適當的值的cookie_max_age說法。超時參數也被檢查,這是一個存儲在cookie中的簽名時間戳。結合max_age,會話的實際到期時間將是max_age和timeout的最小值。

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/api/session.html#pyramid.session.UnencryptedCookieSessionFactoryConfig

創建自定義Cookie

要設置您只需要調用response.set_cookie()你想要的參數的自定義Cookie。如果您使用渲染器,則可以訪問通過request.response使用的響應對象。否則,如果您自己手動創建響應對象,請將其設置在那裏。

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/api/response.html#pyramid.response.Response.set_cookie

+0

'BeakerSessionFactoryConfig' – 2012-01-04 23:02:01

0

這不是正確的方法,但作品。

def login_user(request, usesr_id, time=None): 
""" 
@type request: pyramid.request.Request 
@type usesr_id: int 
@type time: int 
@rtype: Response 
""" 
request.session["user_id"] = usesr_id 
if time is not None: 
    request.session._sess.cookie_expires = datetime.timedelta(seconds=time) 
    request.session._sess._set_cookie_expires(None) 
else: 
    request.session._sess.cookie_expires = True 
    request.session._sess._set_cookie_expires(None) 
request.session._update_cookie_out() 
request.session.save() 
0

我正在尋找類似的解決方案。我使用bottle-cork.py我的用戶認證,需要一種方式讓用戶選擇「保存我登錄」

from bottle, import request, response # etc... 

def post_get(name, default=''): 
    return bottle.request.POST.get(name, default).strip() 

def login(): 
    """Authenticate users""" 
    username = post_get('username').lower() 
    password = post_get('password') 
    keep_login = post_get('keep_login') 
    session = request.environ['beaker.session'] 
    if keep_login == 'true': 
     session.cookie_expires = False 
     response.set_cookie('keep_login', "true") 
    else: 
     session.cookie_expires = True 
     response.set_cookie('keep_login', "false") 
    aaa.login(username, password) 

然而,每一個請求被髮送到服務器時,瓶返回新的會話cookie,默認會在瀏覽器關閉時恢復過期。爲了解決這個問題,我補充說,我呼籲每一個請求發送時間的函數:

def preserve_cookie(request): 
    keep_login = request.get_cookie('keep_login') 
    session = request.environ['beaker.session'] 
    if keep_login == 'true': 
     session.cookie_expires = False 
    return request 

所以,舉例來說:

@bottle.get('/get_username') 
def check_login(user=None): 
    try: 
     aaa.require(username=user) 
    except: 
     raise bottle.HTTPError(401) 
    preserve_cookie(request) 
    return aaa.current_user.username 

這種方式返回的新的cookie保存用戶的偏好保持登錄會話保存。然而,方式beaker.SessionMiddleware目前正在實施,它只是將cookie設置爲2038年1月18日過期。