2012-10-29 104 views
2

现在我正在使用SQLAlchemyAuthenticatorPlugin的网站上工作。您需要用户名和密码才能登录。 我想添加一个电子邮件和密码的登录。所以最终应该可以使用电子邮件/密码或用户名/密码登录。 现在它看起来是这样的:使用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我现在能够与电子邮件/密码成功登录。但当然,用户名/密码不再工作。 关于如何使两个选项同时工作的任何想法?

谢谢!

回答

1

The SQLAlchemy plugins are fairly simple;你可以猴子补丁或实现你自己的插件版本,如

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) 
相关问题