如何限制Flask中的活动登录数

时间:2016-12-13 15:32:22

标签: python authentication flask flask-security

我正在尝试编写一个基本的Flask应用程序来限制用户可以拥有的活动登录数量,即Netflix。我现在正在使用以下策略:

  1. 使用Flask_Security
  2. active_login_count课程存储User字段。
  3. 每次成功登录请求完成后,应用都会将active_login_count增加1.如果这样做会使计数超过限制,则会调用logout_user()
  4. 这是一个糟糕的解决方案,因为如果用户丢失了会话(关闭了隐身模式而没有注销),该应用程序无法减少其登录次数,因此,将来的登录将被阻止。

    一种解决方案是将会话存储在服务器上,但我不知道如何对有效会话进行身份验证。我正在研究Flask_Sessions,但我不知道如何限制活动会话的数量。

    根据我的理解,在默认配置中,Flask会在每个请求上生成新的会话cookie,以防止CSRF攻击。我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

解决这个问题可能有几种方法,但没有一种方法在简单性和有效性之间取得很好的平衡:

一种方法是向您的用户添加一个last_seen字段。选择一些可以用作启发式的数字,以确定某人是否“活跃”。活动中任何足够长的间隔都可能触发active_login_count的重置。这显然有很多明显的漏洞,我目前看到的最大漏洞是,用户可以简单地协调登录并潜在地增加无限数量的活动会话,而您的应用程序则不那么明智。通常,人们倾向于使用类似的“逻辑”机制来维持自己的一生,这是一种耻辱。但我离题了... 通过尝试跟踪用户的活动IP地址,可以使此方法更加复杂。添加一个active_ips字段并填充(n)个ip列表,也许还带有一些浏览器信息等,以尝试对用户的设备进行指纹识别并以此方式进行管理。

另一种方法是使用外部服务,例如Redis实例,甚至是数据库。最多创建(n)个会话ID,这些ID在HTTP标头中传递,并且每次点击api时都会进行检查。没有有效的会话ID,或者如果下一个会话ID构成违约,则无法访问该应用。然后,您只需定期清除这些会话ID,以使其保持最新状态即可。

希望能给您一些有用的想法。