Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Flask登录时禁用从多个不同位置同时登录_Python_Authentication_Flask_Flask Login - Fatal编程技术网

Python 在Flask登录时禁用从多个不同位置同时登录

Python 在Flask登录时禁用从多个不同位置同时登录,python,authentication,flask,flask-login,Python,Authentication,Flask,Flask Login,我有一个用英文写的Web服务。用户A使用一些用户名登录到服务。我希望在用户A的会话过期之前,用户B不可能使用相同的用户名登录。换句话说,我想禁用每个用户的并发登录。如何在中执行此操作?您需要在数据库中的用户模型中存储某种会话令牌 class User(db.Model): .... session_token = db.Column(db.String(40), index=True) 当用户登录时,您将生成会话令牌并将其保存在数据库中 class User(db.Model

我有一个用英文写的Web服务。用户A使用一些用户名登录到服务。我希望在用户A的会话过期之前,用户B不可能使用相同的用户名登录。换句话说,我想禁用每个用户的并发登录。如何在中执行此操作?

您需要在数据库中的用户模型中存储某种会话令牌

class User(db.Model):
    ....
    session_token = db.Column(db.String(40), index=True) 
当用户登录时,您将生成会话令牌并将其保存在数据库中

class User(db.Model):
    ....
    session_token = db.Column(db.String(40), index=True) 
更新您的
用户。获取\u id
函数以返回会话令牌,而不是用户id

def get_id(self):                                                           
    return str(self.session_token) 
user\u loader
回调中,根据令牌查找用户:

@lm.user_loader                                                                 
def load_user(session_token):                                                                                                                        
    return User.query.filter_by(session_token=session_token).first()
通过此设置,令牌将在每次登录时更新,这将自动使以前的会话无效


当用户A登录时,请将该信息保存在服务器端(数据库、文件等),如果用户已登录,则在登录前始终检查服务器端的信息。您知道在哪里实施此操作的示例吗?我明白这个想法,但我想确保我能做得正确。有人能想出这个办法吗?谢谢,这很有效。有没有办法允许最多2台设备同时登录?我尝试在调用
login\u user()
后立即生成并存储会话令牌,但在会话令牌有机会设置之前调用了
get\u id()
。我想在返回
login\u user()
后设置会话令牌,这样我可以保证登录流工作正常。我曾经捕获何时存储使用生成的会话令牌。但是通知发生在调用
get\u id()
后。我发现的唯一可行的方法是在调用
login\u user()
之前手动生成会话令牌并将其存储在数据库中,但这样应用程序的行为可能会不一致。