Пишу авторизацию/регистрацию с помощью JWT, API - DRF.
Frontend - Vue.
Решил написать мини панель-администратора на Vue.
Если логинится обычный пользователь, то Djnago возвращает username, email и token.
Понятно, что у администратора и у обычного пользователя - разные токены.
Но как мне сообщить Vue о том, что пользователь является администратором?
Как идея - добавлять поле is_staff в ответ, если оно равно True.
Насколько это хорошая идея?
И как это реализовать? Был вариант обратиться к модели, взяв данные по username/email (unique), но полагаю, что это не лучшее решение.
models.py
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(db_index=True, max_length=255, unique=True)
email = models.EmailField(db_index=True, unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = UserManager()
def __str__(self):
return self.email
@property
def token(self):
return self._generate_jwt_token()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
def _generate_jwt_token(self):
dt = datetime.now() + timedelta(days=1)
token = jwt.encode({
'id': self.pk,
'exp': int(dt.strftime('%S'))
}, settings.SECRET_KEY, algorithm='HS256')
return token
views.py
class LoginAPIView(APIView):
permission_classes = (AllowAny,)
renderer_classes = (UserJSONRenderer,)
serializer_class = LoginSerializer
def post(self, request):
user = request.data
serializer = self.serializer_class(data=user)
serializer.is_valid(raise_exception=True)
return Response(serializer.data, status=status.HTTP_200_OK)
serializers.py
class LoginSerializer(serializers.Serializer):
email = serializers.CharField(max_length=255)
username = serializers.CharField(max_length=255, read_only=True)
password = serializers.CharField(max_length=128, write_only=True)
token = serializers.CharField(max_length=255, read_only=True)
def validate(self, data):
email = data.get('email', None)
password = data.get('password', None)
if email is None:
raise serializers.ValidationError(
'An email address is required to log in.'
)
if password is None:
raise serializers.ValidationError(
'A password is required to log in.'
)
user = authenticate(username=email, password=password)
if user is None:
raise serializers.ValidationError(
'A user with this email and password was not found.'
)
if not user.is_active:
raise serializers.ValidationError(
'This user has been deactivated.'
)
return {
'email': user.email,
#'username': user.username,
'token': user.token,
}
Также моя попытка (Не работает):
class LoginSerializer(serializers.Serializer):
email = serializers.CharField(max_length=255)
username = serializers.CharField(max_length=255, read_only=True)
password = serializers.CharField(max_length=128, write_only=True)
token = serializers.CharField(max_length=255, read_only=True)
def validate(self, data):
email = data.get('email', None)
password = data.get('password', None)
if email is None:
raise serializers.ValidationError(
'An email address is required to log in.'
)
if password is None:
raise serializers.ValidationError(
'A password is required to log in.'
)
user = authenticate(username=email, password=password)
if user is None:
raise serializers.ValidationError(
'A user with this email and password was not found.'
)
if not user.is_active:
raise serializers.ValidationError(
'This user has been deactivated.'
)
data_user = {
'email': user.email,
#'username': user.username,
'token': user.token,
}
if user.is_staff:
data_user.update({'is_admin': user.is_staff})
return data_user