Ability to use simplified login

This commit is contained in:
eugena 2015-09-29 16:15:56 +05:00
parent 04136c6e35
commit 825b7c8def
5 changed files with 82 additions and 4 deletions

View File

@ -8,6 +8,8 @@ Configuration
- LOGIN_SERIALIZER - serializer class in ``rest_auth.views.LoginView``, default value ``rest_auth.serializers.LoginSerializer``
- SIMPLE_LOGIN_SERIALIZER - serializer class in ``rest_auth.views.SimpleLoginView``, default value ``rest_auth.serializers.SimpleLoginSerializer``
- TOKEN_SERIALIZER - response for successful authentication in ``rest_auth.views.LoginView``, default value ``rest_auth.serializers.TokenSerializer``
- USER_DETAILS_SERIALIZER - serializer class in ``rest_auth.views.UserDetailsView``, default value ``rest_auth.serializers.UserDetailsSerializer``
@ -40,3 +42,6 @@ Configuration
- **USER_DETAILS_INCLUDED** - is user details urls are needed
- **SIMPLE_LOGIN** - is simplified is used

View File

@ -4,6 +4,7 @@ from rest_auth.serializers import (
TokenSerializer as DefaultTokenSerializer,
UserDetailsSerializer as DefaultUserDetailsSerializer,
LoginSerializer as DefaultLoginSerializer,
SimpleLoginSerializer as DefaultSimpleLoginSerializer,
PasswordResetSerializer as DefaultPasswordResetSerializer,
PasswordResetConfirmSerializer as DefaultPasswordResetConfirmSerializer,
PasswordChangeSerializer as DefaultPasswordChangeSerializer)
@ -23,6 +24,10 @@ LoginSerializer = import_callable(
serializers.get('LOGIN_SERIALIZER', DefaultLoginSerializer)
)
SimpleLoginSerializer = import_callable(
serializers.get('SIMPLE_LOGIN_SERIALIZER', DefaultSimpleLoginSerializer)
)
PasswordResetSerializer = import_callable(
serializers.get(
'PASSWORD_RESET_SERIALIZER',

View File

@ -14,6 +14,34 @@ from rest_framework.authtoken.models import Token
from rest_framework.exceptions import ValidationError
class SimpleLoginSerializer(serializers.Serializer):
username = serializers.CharField()
password = serializers.CharField(style={'input_type': 'password'})
def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
if username and password:
user = authenticate(username=username, password=password)
else:
msg = _('Must include "username" and "password".')
raise exceptions.ValidationError(msg)
# Did we get back an active user?
if user:
if not user.is_active:
msg = _('User account is disabled.')
raise exceptions.ValidationError(msg)
else:
msg = _('Unable to log in with provided credentials.')
raise exceptions.ValidationError(msg)
attrs['user'] = user
return attrs
class LoginSerializer(serializers.Serializer):
username = serializers.CharField(required=False, allow_blank=True)
email = serializers.EmailField(required=False, allow_blank=True)

View File

@ -3,7 +3,7 @@ from django.conf.urls import patterns, url
from django.conf import settings
from rest_auth.views import (
LoginView, LogoutView, UserDetailsView, PasswordChangeView,
LoginView, SimpleLoginView, LogoutView, UserDetailsView, PasswordChangeView,
PasswordResetView, PasswordResetConfirmView
)
@ -14,7 +14,6 @@ urlpatterns = patterns(
name='rest_password_reset'),
url(r'^password/reset/confirm/$', PasswordResetConfirmView.as_view(),
name='rest_password_reset_confirm'),
url(r'^login/$', LoginView.as_view(), name='rest_login'),
# URLs that require a user to be logged in with a valid session / token.
url(r'^logout/$', LogoutView.as_view(), name='rest_logout'),
url(r'^password/change/$', PasswordChangeView.as_view(),
@ -26,3 +25,14 @@ if getattr(settings, 'USER_DETAILS_INCLUDED', True):
'',
url(r'^user/$', UserDetailsView.as_view(), name='rest_user_details'),
)
if getattr(settings, 'SIMPLE_LOGIN', False):
urlpatterns += patterns(
'',
url(r'^login/$', SimpleLoginView.as_view(), name='rest_login'),
)
else:
urlpatterns += patterns(
'',
url(r'^login/$', LoginView.as_view(), name='rest_login'),
)

View File

@ -10,11 +10,41 @@ from rest_framework.authtoken.models import Token
from rest_framework.generics import RetrieveUpdateAPIView
from .app_settings import (
TokenSerializer, UserDetailsSerializer, LoginSerializer,
PasswordResetSerializer, PasswordResetConfirmSerializer,
TokenSerializer, UserDetailsSerializer, SimpleLoginSerializer,
LoginSerializer, PasswordResetSerializer, PasswordResetConfirmSerializer,
PasswordChangeSerializer
)
class SimpleLoginView(GenericAPIView):
"""
Check the credentials and authenticated if the credentials are valid .
Calls Django Auth login method to register User ID
in Django session framework
Accept the following POST parameters: username, password
"""
permission_classes = (AllowAny,)
serializer_class = SimpleLoginSerializer
def login(self):
self.user = self.serializer.validated_data['user']
if getattr(settings, 'REST_SESSION_LOGIN', True):
login(self.request, self.user)
def get_error_response(self):
return Response(
self.serializer.errors, status=status.HTTP_400_BAD_REQUEST
)
def post(self, request, *args, **kwargs):
self.serializer = self.get_serializer(data=self.request.data)
if not self.serializer.is_valid():
return self.get_error_response()
self.login()
return Response({}, status=status.HTTP_200_OK)
class LoginView(GenericAPIView):