Added Django authentication backend
This commit is contained in:
		
							
								
								
									
										0
									
								
								mongoengine/django/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								mongoengine/django/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										78
									
								
								mongoengine/django/auth.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								mongoengine/django/auth.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | from mongoengine import * | ||||||
|  |  | ||||||
|  | from django.utils.hashcompat import md5_constructor, sha_constructor | ||||||
|  | from django.utils.encoding import smart_str | ||||||
|  | from django.contrib.auth.models import AnonymousUser | ||||||
|  |  | ||||||
|  | import datetime | ||||||
|  |  | ||||||
|  | REDIRECT_FIELD_NAME = 'next' | ||||||
|  |  | ||||||
|  | def get_hexdigest(algorithm, salt, raw_password): | ||||||
|  |     raw_password, salt = smart_str(raw_password), smart_str(salt) | ||||||
|  |     if algorithm == 'md5': | ||||||
|  |         return md5_constructor(salt + raw_password).hexdigest() | ||||||
|  |     elif algorithm == 'sha1': | ||||||
|  |         return sha_constructor(salt + raw_password).hexdigest() | ||||||
|  |     raise ValueError('Got unknown password algorithm type in password') | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class User(Document): | ||||||
|  |     """A User document that aims to mirror most of the API specified by Django | ||||||
|  |     at http://docs.djangoproject.com/en/dev/topics/auth/#users | ||||||
|  |     """ | ||||||
|  |     username = StringField(max_length=30, required=True) | ||||||
|  |     first_name = StringField(max_length=30) | ||||||
|  |     last_name = StringField(max_length=30) | ||||||
|  |     email = StringField() | ||||||
|  |     password = StringField(max_length=128) | ||||||
|  |     is_staff = BooleanField(default=False) | ||||||
|  |     is_active = BooleanField(default=True) | ||||||
|  |     is_superuser = BooleanField(default=False) | ||||||
|  |     last_login = DateTimeField(default=datetime.datetime.now) | ||||||
|  |  | ||||||
|  |     def get_full_name(self): | ||||||
|  |         full_name = u'%s %s' % (self.first_name or '', self.last_name or '') | ||||||
|  |         return full_name.strip() | ||||||
|  |  | ||||||
|  |     def is_anonymous(self): | ||||||
|  |         return False | ||||||
|  |  | ||||||
|  |     def is_authenticated(self): | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  |     def set_password(self, raw_password): | ||||||
|  |         from random import random | ||||||
|  |         algo = 'sha1' | ||||||
|  |         salt = get_hexdigest(algo, str(random()), str(random()))[:5] | ||||||
|  |         hash = get_hexdigest(algo, salt, raw_password) | ||||||
|  |         self.password = '%s$%s$%s' % (algo, salt, hash) | ||||||
|  |  | ||||||
|  |     def check_password(self, raw_password): | ||||||
|  |         algo, salt, hash = self.password.split('$') | ||||||
|  |         return hash == get_hexdigest(algo, salt, raw_password) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MongoEngineBackend(object): | ||||||
|  |     """Authenticate using MongoEngine and mongoengine.django.auth.User. | ||||||
|  |     """ | ||||||
|  |  | ||||||
|  |     def authenticate(self, username=None, password=None): | ||||||
|  |         user = User.objects(username=username).first() | ||||||
|  |         if user: | ||||||
|  |             if password and user.check_password(password): | ||||||
|  |                 return user | ||||||
|  |         return None | ||||||
|  |  | ||||||
|  |     def get_user(self, user_id): | ||||||
|  |         return User.objects.with_id(user_id) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_user(userid): | ||||||
|  |     """Returns a User object from an id (User.id). Django's equivalent takes | ||||||
|  |     request, but taking an id instead leaves it up to the developer to store | ||||||
|  |     the id in any way they want (session, signed cookie, etc.) | ||||||
|  |     """ | ||||||
|  |     if not userid: | ||||||
|  |         return AnonymousUser() | ||||||
|  |     return MongoEngineBackend().get_user(userid) or AnonymousUser() | ||||||
		Reference in New Issue
	
	Block a user