默认情况下,Cookie会话结束时到期,因此用户每次关闭浏览器后都需要登录。但是remember
选项怎么样 - 如何设置没有过期日期的cookie?我试图在development.ini文件中添加session.cookie_expires = False
,但它没有帮助。
另一个问题:如何设置自定义Cookie标头(例如lang
到主Cookie但没有过期日期)?
修改
我在pyramid.authentication.AuthTktAuthenticationPolicy中找到了max_age
参数,可让您在会话之间保存Cookie。但是remember me
max_age
在__init__.py
(配置)文件中定义remember me
时如何实施{{1}}复选框必须在登录视图中定义?
答案 0 :(得分:3)
“记住我”背后的想法是,这是一个在登录和会话之间持续的选项。这最好作为单独的cookie实现,如果用户选中该框,您可以设置该cookie。如果“记住我”意味着如果策略已过期,应用程序应该重新登录,那么只需存储一个永不过期的签名cookie。然后,当应用程序引发HTTPForbidden
因为用户未登录时,您可以检查cookie,看到他们想要记住,重新登录,然后将它们重定向回到他们尝试的位置走。这只是一个选择,取决于你“记住我”的意思。
如果您正在使用UnencryptedCookieSessionFactoryConfig
会话工厂,则需要为cookie_max_age
参数传递适当的值。还会检查timeout参数,该参数是存储在cookie中的签名时间戳。结合max_age,会话的实际到期时间将是max_age和timeout的最小值。
要设置自定义Cookie,只需使用您想要的参数调用response.set_cookie()
即可。如果您使用的是渲染器,则可以访问通过request.response
使用的响应对象。否则,如果您自己手动创建响应对象,只需将其设置在那里。
答案 1 :(得分: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()
答案 2 :(得分: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.essionMiddleware目前正在实施,它只是将cookie设置为2038年1月18日到期。