mirror of
https://github.com/wassname/flask-security.git
synced 2026-07-27 11:22:12 +08:00
When logging in user lookups on email should be case insensitive
This commit is contained in:
@@ -82,6 +82,10 @@ class UserDatastore(object):
|
||||
kwargs['roles'] = roles
|
||||
return kwargs
|
||||
|
||||
def get_user(self, id_or_email):
|
||||
"""Returns a user matching the specified ID or email address"""
|
||||
raise NotImplementedError
|
||||
|
||||
def find_user(self, *args, **kwargs):
|
||||
"""Returns a user matching the provided parameters."""
|
||||
raise NotImplementedError
|
||||
@@ -175,6 +179,11 @@ class SQLAlchemyUserDatastore(SQLAlchemyDatastore, UserDatastore):
|
||||
SQLAlchemyDatastore.__init__(self, db)
|
||||
UserDatastore.__init__(self, user_model, role_model)
|
||||
|
||||
def get_user(self, id_or_email):
|
||||
return (self.user_model.query.get(id_or_email) or
|
||||
self.user_model.query.filter(
|
||||
self.user_model.email.ilike(id_or_email)).first())
|
||||
|
||||
def find_user(self, **kwargs):
|
||||
return self.user_model.query.filter_by(**kwargs).first()
|
||||
|
||||
@@ -190,6 +199,13 @@ class MongoEngineUserDatastore(MongoEngineDatastore, UserDatastore):
|
||||
MongoEngineDatastore.__init__(self, db)
|
||||
UserDatastore.__init__(self, user_model, role_model)
|
||||
|
||||
def get_user(self, id_or_email):
|
||||
from mongoengine import ValidationError
|
||||
try:
|
||||
return self.user_model.objects(id=id_or_email).first()
|
||||
except ValidationError:
|
||||
return self.user_model.objects(email__iexact=id_or_email).first()
|
||||
|
||||
def find_user(self, **kwargs):
|
||||
try:
|
||||
from mongoengine.queryset import Q, QCombination
|
||||
@@ -217,6 +233,17 @@ class PeeweeUserDatastore(PeeweeDatastore, UserDatastore):
|
||||
UserDatastore.__init__(self, user_model, role_model)
|
||||
self.UserRole = role_link
|
||||
|
||||
def get_user(self, id_or_email):
|
||||
try:
|
||||
return self.user_model.get(self.user_model.id == id_or_email)
|
||||
except ValueError:
|
||||
pass
|
||||
try:
|
||||
return self.user_model.get(self.user_model.email ** id_or_email)
|
||||
except self.user_model.DoesNotExist:
|
||||
pass
|
||||
return None
|
||||
|
||||
def find_user(self, **kwargs):
|
||||
try:
|
||||
return self.user_model.filter(**kwargs).get()
|
||||
|
||||
@@ -219,7 +219,7 @@ class LoginForm(Form, NextFormMixin):
|
||||
self.password.errors.append(get_message('PASSWORD_NOT_PROVIDED')[0])
|
||||
return False
|
||||
|
||||
self.user = _datastore.find_user(email=self.email.data)
|
||||
self.user = _datastore.get_user(self.email.data)
|
||||
|
||||
if self.user is None:
|
||||
self.email.errors.append(get_message('USER_DOES_NOT_EXIST')[0])
|
||||
|
||||
@@ -33,6 +33,10 @@ class DefaultSecurityTests(SecurityTest):
|
||||
r = self.authenticate()
|
||||
self.assertIn('Hello matt@lp.com', r.data)
|
||||
|
||||
def test_authenticate_case_insensitive_email(self):
|
||||
r = self.authenticate(email='MATT@lp.com')
|
||||
self.assertIn('Hello matt@lp.com', r.data)
|
||||
|
||||
def test_unprovided_username(self):
|
||||
r = self.authenticate("")
|
||||
self.assertIn(self.get_message('EMAIL_NOT_PROVIDED'), r.data)
|
||||
|
||||
Reference in New Issue
Block a user