Authentication 使用SQLAlchemyAuthenticatorPlugin以电子邮件或用户名登录

Authentication 使用SQLAlchemyAuthenticatorPlugin以电子邮件或用户名登录,authentication,sqlalchemy,Authentication,Sqlalchemy,现在我正在一个使用SQLAlchemyAuthenticatorPlugin的网站上工作。您需要用户名和密码才能登录。 我想添加一个带有电子邮件和密码的登录名。因此,最终应该可以使用电子邮件/密码或用户名/密码登录。 现在看起来是这样的: sqlauth = SQLAlchemyAuthenticatorPlugin(model.User, model.meta.Session) sqlauth.translations['user_name'] = 'email' sql_user_md =

现在我正在一个使用SQLAlchemyAuthenticatorPlugin的网站上工作。您需要用户名和密码才能登录。 我想添加一个带有电子邮件和密码的登录名。因此,最终应该可以使用电子邮件/密码或用户名/密码登录。 现在看起来是这样的:

sqlauth = SQLAlchemyAuthenticatorPlugin(model.User, model.meta.Session)
sqlauth.translations['user_name'] = 'email'
sql_user_md = SQLAlchemyUserMDPlugin(model.User, model.meta.Session)
sql_user_md.translations['user_name'] = 'email'
使用sqlauth.translations,我现在可以使用电子邮件/密码成功登录。但是用户名/密码当然不再有效了。 关于如何使这两个选项同时工作,有什么想法吗

谢谢

;您可以对它们进行修补,也可以实现自己版本的插件,如

来自sqlalchemy.orm.exc import NoResultFound,MultipleResultsFound
导入repoze.who.plugins.sa
类_EmailBaseSQLAlchemyPlugin(对象)
默认翻译={'user\u name':'user\u name','email':'email',
“验证密码”:“验证密码”}
def get_用户(自我,登录):
login_type='email'如果在login else'user_name'中使用'@'
login\u attr=getattr(self.user\u类,self.translations[login\u type])
query=self.dbsession.query(self.user_类)
query=query.filter(login\u attr==login)
尝试:
返回query.one()
除了(NoResultFound、MultipleResultsFound):
#正如repose.who文档中所建议的,重要的是
#验证只有一个匹配的用户ID。
一无所获
类EmailSQLAlchemyAuthenticatorPlugin(_EmailBaseSQLAlchemyPlugin,
repoze.who.plugins.sa.SQLAlchemyAuthenticatorPlugin):
通过
类EmailSQLAlchemyUserMDPlugin(_EmailBaseSQLAlchemyPlugin,
repoze.who.plugins.sa.SQLAlchemyUserMDPlugin):
通过
sqlauth=EmailSQLAlchemyAuthenticatorPlugin(model.User,model.meta.Session)
sql\u user\u md=SQLAlchemyUserMDPlugin(model.user,model.meta.Session)