2

現在、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 を使用すると、電子メール/パスワードで正常にログインできるようになりました。もちろん、ユーザー名/パスワードはもう機能していません。両方のオプションを同時に機能させる方法についてのアイデアはありますか?

ありがとう!

4

1 に答える 1

1

SQLAlchemy プラグインはかなり単純です。それらにモンキーパッチを適用するか、独自のバージョンのプラグインを実装することができます。

from sqlalchemy.orm.exc import NoResultFound, MultipleResultsFound
import repoze.who.plugins.sa
class _EmailBaseSQLAlchemyPlugin(object)
    default_translations = {'user_name': "user_name", 'email': 'email',
                            'validate_password': 'validate_password'}

    def get_user(self, login):
        login_type = 'email' if '@' in login else 'user_name'
        login_attr = getattr(self.user_class, self.translations[login_type])
        query = self.dbsession.query(self.user_class)
        query = query.filter(login_attr == login)

        try:
            return query.one()
        except (NoResultFound, MultipleResultsFound):
            # As recommended in the docs for repoze.who, it's important to
            # verify that there's only _one_ matching userid.
            return None

class EmailSQLAlchemyAuthenticatorPlugin(_EmailBaseSQLAlchemyPlugin,
          repoze.who.plugins.sa.SQLAlchemyAuthenticatorPlugin):
    pass
class EmailSQLAlchemyUserMDPlugin(_EmailBaseSQLAlchemyPlugin,
          repoze.who.plugins.sa.SQLAlchemyUserMDPlugin):
    pass

sqlauth = EmailSQLAlchemyAuthenticatorPlugin(model.User, model.meta.Session)
sql_user_md = SQLAlchemyUserMDPlugin(model.User, model.meta.Session)
于 2012-10-29T15:03:52.383 に答える