繁体   English   中英

自定义身份验证后端冲突默认后端

custom authentication backends conflict default backend

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我的任务有2个视图1.接受电话号码和密码验证以登录用户

2。 接受没有密码的电话号码和令牌,以执行我创建的自定义后端,其中无需密码即可完成身份验证

当我在AUTHENTICTION BACKENDS中的设置中添加此自定义后端时,它使视图2登录时无需密码auth,用户可以使用任何密码登录! 所以如何在设置中添加2个后端而不互相冲突

自定义后端

class PasswordlessAuthBackend(ModelBackend):
    """Log in to Django without providing a password."""
    # model=UserProfile
    def authenticate(self,auth_token=None, password=None,username=None,phone_number=None,):
        try:
            return UserProfile.objects.get(phone_number=phone_number)
        except UserProfile.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return UserProfile.objects.get(pk=user_id)
        except UserProfile.DoesNotExist:
            return None

views.py:


class LoginView(APIView):
    serializer_class = LoginSerializer 
    authentication_classes = (ModelBackend,)
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data
                                           )
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            user = serializer.validated_data
            login(request,user,backend="django.contrib.auth.backends.ModelBackend")
            token, created = Token.objects.get_or_create(user=user)
            return Response(
                            {'user':new_data,'token':token.key,},
                            status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class TokenView(APIView):
    throttle_classes=()
    permission_classes = ()
    # authentication_classes = (PasswordlessAuthBackend,)
    serializer_class=TokenSerializer
    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data,
                                           context={'request': request})
        if serializer.is_valid(raise_exception=True):
            user = serializer.validated_data
            user.backend='accounts.auth_backends.PasswordlessAuthBackend'
            print(user)
            token, created = Token.objects.get_or_create(user=user)
            login(request,user,backend='accounts.auth_backends.PasswordlessAuthBackend')
            return Response({
                    'token': token.key,
                    'user_id': user.pk,},

serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    email=serializers.EmailField(required=False)
    class Meta:
        model = UserProfile
        fields = ('first_name','last_name','country_code','phone_number','gender','birthdate','avatar','email')

    def create(self, validated_data):
        user = UserProfile.objects.create(**validated_data)
        return user

class LoginSerializer(serializers.Serializer):
    phone_number = serializers.CharField(required=True, allow_blank=False)
    password = serializers.CharField(required=True,style={'input_type': 'password'})
    def validate(self, attrs, ):
        user = authenticate(
            phone_number=attrs['phone_number'], password=attrs['password'])
        # user = self._validate_phonenumber(phonenumber, first_token)
        if user is None:
            raise serializers.ValidationError('invalid credentials provided')
        return user

class TokenSerializer(serializers.Serializer):
    phone_number = serializers.CharField(required=True, allow_blank=False)
    def validate(self, attrs,):
        user = authenticate(
            phone_number=attrs['phone_number'])

        if user is None:
            raise serializers.ValidationError('invalid credentials provided')
        self.instance = user
        return user

settings.py:

AUTHENTICATION_BACKENDS = (
        'accounts.auth_backends.PasswordlessAuthBackend',
        "django.contrib.auth.backends.ModelBackend",
)
1 个回复

您的PasswordlessAuthBackend似乎在不检查密码/令牌的情况下登录了用户。

Django检查您后端的参数名称,以确定是否可以调用它。 尝试为每个用例制作一个后端, 使用该身份验证所需的参数(例如phone_number,令牌)

class CustomAuthBackend:
    def authenticate(phone_number=None, token=None):
        try:
            phone = normalize_phone(phone) # standardize to single format
            return User.objects.get(phone=phone, token=token) # or whatever
        except ObjectDoesNotExist:
            return None 

序列化器和视图可以以任何方式组合,但实际上只是调用身份验证。 您似乎已经在执行此操作。

  • 仅在进行会话身份验证时才需要login调用
  • authenticate()将为您设置user.backendlogin()将读取。 您无需在通话中手动设置它。
3 未调用 django 自定义身份验证后端

我正在使用 Django 3.1,并试图弄清楚为什么我的自定义身份验证后端没有被调用。 在我的 settings.py 文件中,我有: 在我的 sizzy.backends.py 文件中,我有: 然后我打开manage.py shell并输入: 它输出: 而且我没有看到任何打印语句 ...

4 无法使用自定义身份验证后端登录

我使用LDAP创建自定义身份验证后端。 我想检查用户是否存在于数据库中,但是将“密码”密码检查委托给LDAP(由于公司政策,密码经常更改)。 使用Django管理界面时,后端工作良好,但是当我使用FormView创建自定义登录页面时,出现以下错误: settings.py ...

5 如何实现 Firebase 自定义身份验证后端?

我想要自定义 firebase 身份验证,其中用户管理从属用户的角色。 我需要了解如何实现我自己的后端身份验证系统的指导。 文档到处都提到“将用户名和密码发送到将生成自定义令牌的后端”。 这是什么后台? 我在哪里追求这个? 我的知识领域是 firebase、firebase 函数、angular 2 ...

7 Django的自定义身份验证后端问题

我遇到了自定义身份验证后端的问题,我是通过LDAP身份验证为Active Directory构建的。 问题是从管理员登录页面,在它正确地验证并在数据库中创建新用户(或从LDAP服务器更新其信息)之后,然后将我返回到管理员登录页面,指示我未能输入有效用户名和密码。 考虑到它在djang ...

10 如何进行自定义身份验证后端?

我有一个具有2个登录名的Web系统,其中一个是使用用户名和密码的普通登录名,另一个登录名只能是一个名为rfid的字段,目前我正在测试用户名字段,然后将其更改为现场RFID。 如果我要执行的操作是不使用密码登录,为此,我实现了一个后端,可以使用不使用密码登录的用户,只是他还没有允许我登录,并且一直在询 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM