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`` - 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`` - 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`` - 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 - **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, TokenSerializer as DefaultTokenSerializer,
UserDetailsSerializer as DefaultUserDetailsSerializer, UserDetailsSerializer as DefaultUserDetailsSerializer,
LoginSerializer as DefaultLoginSerializer, LoginSerializer as DefaultLoginSerializer,
SimpleLoginSerializer as DefaultSimpleLoginSerializer,
PasswordResetSerializer as DefaultPasswordResetSerializer, PasswordResetSerializer as DefaultPasswordResetSerializer,
PasswordResetConfirmSerializer as DefaultPasswordResetConfirmSerializer, PasswordResetConfirmSerializer as DefaultPasswordResetConfirmSerializer,
PasswordChangeSerializer as DefaultPasswordChangeSerializer) PasswordChangeSerializer as DefaultPasswordChangeSerializer)
@ -23,6 +24,10 @@ LoginSerializer = import_callable(
serializers.get('LOGIN_SERIALIZER', DefaultLoginSerializer) serializers.get('LOGIN_SERIALIZER', DefaultLoginSerializer)
) )
SimpleLoginSerializer = import_callable(
serializers.get('SIMPLE_LOGIN_SERIALIZER', DefaultSimpleLoginSerializer)
)
PasswordResetSerializer = import_callable( PasswordResetSerializer = import_callable(
serializers.get( serializers.get(
'PASSWORD_RESET_SERIALIZER', 'PASSWORD_RESET_SERIALIZER',

View File

@ -14,6 +14,34 @@ from rest_framework.authtoken.models import Token
from rest_framework.exceptions import ValidationError 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): class LoginSerializer(serializers.Serializer):
username = serializers.CharField(required=False, allow_blank=True) username = serializers.CharField(required=False, allow_blank=True)
email = serializers.EmailField(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 django.conf import settings
from rest_auth.views import ( from rest_auth.views import (
LoginView, LogoutView, UserDetailsView, PasswordChangeView, LoginView, SimpleLoginView, LogoutView, UserDetailsView, PasswordChangeView,
PasswordResetView, PasswordResetConfirmView PasswordResetView, PasswordResetConfirmView
) )
@ -14,7 +14,6 @@ urlpatterns = patterns(
name='rest_password_reset'), name='rest_password_reset'),
url(r'^password/reset/confirm/$', PasswordResetConfirmView.as_view(), url(r'^password/reset/confirm/$', PasswordResetConfirmView.as_view(),
name='rest_password_reset_confirm'), 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. # 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'^logout/$', LogoutView.as_view(), name='rest_logout'),
url(r'^password/change/$', PasswordChangeView.as_view(), 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'), 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 rest_framework.generics import RetrieveUpdateAPIView
from .app_settings import ( from .app_settings import (
TokenSerializer, UserDetailsSerializer, LoginSerializer, TokenSerializer, UserDetailsSerializer, SimpleLoginSerializer,
PasswordResetSerializer, PasswordResetConfirmSerializer, LoginSerializer, PasswordResetSerializer, PasswordResetConfirmSerializer,
PasswordChangeSerializer 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): class LoginView(GenericAPIView):