Python Flask安全性的自定义身份验证方法

Python Flask安全性的自定义身份验证方法,python,flask-login,flask-security,Python,Flask Login,Flask Security,我正在使用flask安全性对用户进行身份验证。我已确保身份验证与http\u auth\u requireddecorator一起正常工作-正在根据userstore(在我的情况下是SQLAlchemyUserDatastore)验证用户,一切正常 我现在想使用我自己的身份验证方法(我将使用自定义LDAP验证系统),同时仍然利用Flask Security提供给我的东西(比如当前用户)。我写了一个定制的装饰器,看起来像这样: def使用ldap进行身份验证(func): @包装(func) de

我正在使用flask安全性对用户进行身份验证。我已确保身份验证与
http\u auth\u required
decorator一起正常工作-正在根据userstore(在我的情况下是
SQLAlchemyUserDatastore
)验证用户,一切正常

我现在想使用我自己的身份验证方法(我将使用自定义LDAP验证系统),同时仍然利用Flask Security提供给我的东西(比如
当前用户
)。我写了一个定制的装饰器,看起来像这样:

def使用ldap进行身份验证(func):
@包装(func)
def包装(*args,**kwargs):
如果未请求授权:
返回未经授权的用户处理程序()
user=user\u datastore.get\u user(request.authorization.username)
如果不是用户或未使用\u ldap对\u进行身份验证(user.email、user.password):
返回未经授权的用户处理程序()
返回函数(*args,**kwargs)
返回包装器
然而,当我查看
http\u auth\u required
装饰器时,我看到它使用了一个名为
\u check\u http\u auth
的私有函数,它正在做一些不访问私有成员我自己无法做的事情,比如将用户设置到请求上下文堆栈的顶部并发送信号。代码如下所示:

def\u check\u http\u auth():
auth=request.authorization或BasicAuth(用户名=None,密码=None)
user=\u security.datastore.find\u user(email=auth.username)
如果用户和utils.verify\u和\u update\u密码(auth.password,user):
_security.datastore.commit()
app=current\u app.\u get\u current\u object()
_请求\u ctx\u stack.top.user=user
identity\u changed.send(应用程序,identity=identity(user.id))
返回真值
返回错误

所以我的问题是:在充分利用Flask安全性的同时,使用自定义身份验证方法的正确方法是什么?

您可以通过一个快速的monkey补丁来实现这一点。不太理想,但我不确定你还能做什么,直到Flask安全团队以一种更优雅的方式来处理这个问题

import flask_security

def verify_and_update_password_custom(password, user):
    return user.verify_password(password)    

flask_security.forms.verify_and_update_password = verify_and_update_password_custom
我不确定它是否在其他地方使用。以上是我自己的目的。如果它确实在其他地方被调用,您只需要将它安装到任何地方