现在要实现两个功能:
1.用户关掉浏览器后,2 个小时之内再打开,可以不用再登录。
2.用户登录后,停在页面 1 个小时不操作,则强制登出。
我现在用的是 Flask-login,用了 login_user()的 remember me 功能,并在 config 里配置了 REMEMBER_COOKIE_DURATION = timedelta(hours=2)。我原以为这一步只能实现第一个功能。
后来我又谷歌了半天,很多都说要配置 session 以实现第二个功能:
在 login 的视图函数中:
session.permanent = True
app.permanent_session_lifetime = timedelta(hours=1)
可是我发现 cookie 这个 2 小时过期是已经实现了,但第二个功能好像并没有实现
我的问题是:
1.如果我两个功能要求的过期时间一样,只配置 cookie 过期时间,能同时实现两个功能吗。
2.如果是我现在要实现的这两个功能,我配置的问题出在哪里。
1
PressOne 2018-05-02 09:42:32 +08:00
第二个功能,要每次请求之后,通过 js 定时请求,才能判断是不是过期。每次新请求之后,刷新这个 js 定时器就可以了
|
2
guiqiqi 2018-05-02 09:48:44 +08:00 via iPhone
没有用过 flask-login,但是自己写了一套基于 flask 的用户和权限系统,cookie 的有效时间可以在返回的 response 中使用 set_cookie 来设置,其中的第三个参数是有效时间;
在你的问题里面,如果两个时间相同,配置这个就足够了(例如将过期时间配置成 2h ); 如果非要让用户在 1h 之内没有任何操作就要登出的话我给你一个思路:加载完毕页面之后前端 setInterval(1h),给后端发一个登出的 ajax 请求,后段返回的请求带上作废 cookie 的请求给浏览器,ajax 完了之后弹个框通知用户已被登出。 当然这只是一个思路,希望能帮到你。 |
3
mzmxcvbn OP @guiqiqi 谢谢回复,我想问一下 session.permanent = True
app.permanent_session_lifetime = timedelta(hours=1)这几个配置是在什么情况下用到的呢 |
4
guiqiqi 2018-05-02 18:48:37 +08:00 via iPhone
@mzmxcvbn #3
官方文档中就有说明:启用 permanent 之后 session lifetime 才会被应用,否则 session 在浏览器关闭时过期(在浏览器端就是 cookies 过期); 建议多看官方文档。 |
6
lfzyx 2018-10-20 13:50:59 +08:00
第二个功能,如果是为了安全,那你用 js 完全没有意义,通过修改 js 发送的数据,就可以骗过服务端。
正确的做法是用户每次点击 url 后,都在数据库的用户表里更新时间戳,这样下一次点击 url 就可以对比了 |
7
polar9527 2019-04-18 18:53:32 +08:00
我的理解是这两个功能有冲突,当你这样配置好后,在第二个功能中 1 个小时后虽然“ session ”这个 cookie 失效了,但是,flask_login 还是会从名叫“ remember_token ”的 cookie 中将用户登录信息重新载入到名叫“ session ”的 cookie 中。具体源码可以看一下 flask_login.login_manager._load_user 这个函数
|
8
polar9527 2019-04-18 18:55:27 +08:00
|