当前位置: 首页 > 知识库问答 >
问题:

客户用户身份验证错误:AttributeError:Manager不可用;“auth.user”已交换为“user_management.customuser”

濮金鑫
2023-03-14

    from django.db import models
    from django.contrib.auth.models import AbstractBaseUser,BaseUserManager,PermissionsMixin
    from django.core.mail import send_mail
    from django.utils.translation import ugettext_lazy as _
    #now=time.strftime('%Y-%M-%D %H:%m:%S.%u%Z')
    import datetime
    from datetime import timedelta

    from django.utils import timezone
    from django.utils.timezone import now


    tomorrow = timezone.now() + timedelta(days=1)
    current_time= timezone.now()

    class CustomUserManager(BaseUserManager):
        def _create_user(self,email,password,is_staff,is_superuser, **extra_fields):

            if not email:
                raise ValueError('The given email must be set')

            email=self.normalize_email(email)
            user= self.model(email=email,
                             is_staff=is_staff,
                             is_active = True,
                             is_superuser =is_superuser,
                             last_login=timezone.now(),
                             date_joined=timezone.now(),
                            **extra_fields)
            user.set_password(password)
            user.save(using=self._db)
            return user

        def create_user(self, email,password=None,**extra_fields):
            return self._create_user(email,password,False,False,**extra_fields)

        def create_superuser(self, email,password,**extra_fields):
            return self._create_user(email,password,True,True,**extra_fields)

    class CustomUser(AbstractBaseUser,PermissionsMixin):
        username =models.CharField(max_length =255, unique = True,blank = True,null= True)
        email =models.EmailField(blank=False, unique =True)
        date_joined  = models.DateTimeField(_('date joined'), default=now)
        is_active    = models.BooleanField(default=True)
        is_admin     = models.BooleanField(default=False)
        is_staff     = models.BooleanField(default=False)
        is_superuser = models.BooleanField(default=False)

        USERNAME_FIELD ='email'
        REQUIRED_FIELD =['user_name','date_joined']

        objects=CustomUserManager()

        class Meta:
            verbose_name=_('user')
            verbose_name_plural=_('users')

        def get_absolute_url(self):
            return "/user/%s" %urlquote(self.email)

        def get_full_name(self):

            a=UserProfile.objects.get(email_id=self.id)
            self.first_name=a.first_name
            self.last_name= a.last_name
            if not self.first_name and not self.last_name:
                full_name =self.email
            else:
                full_name = '%s %s' %(self.first_name,self.last_name)
            return full_name.strip()

        def get_short_name(self):
            self.first_name='a'
            return self.first_name

        def email_user(self,subject,message,from_email=None):
            send_mail(subject,message,from_email,[self.email])


            #code

    class UserProfile(models.Model):

        email = models.OneToOneField(CustomUser,unique =True,primary_key=True)
        first_name=models.CharField(max_length =256, blank = True)
        last_name=models.CharField(max_length =256, blank = True)
        activation_key = models.CharField(max_length=40,blank=True)
        gender = models.CharField(max_length=6, null=True,blank=True,choices=(
            ('male', 'Male'),
            ('female', 'Female'),))
        date_of_birth=models.DateField(null=True,blank=True)
        key_expires = models.DateTimeField(default=tomorrow)

        def __str__(self):
            full_name = '%s %s' %(self.first_name,self.last_name)
            return full_name

        class Meta:
            verbose_name=u'User profile'
            verbose_name_plural=u'User profiles'

        models.OneToOneField(CustomUser, related_name='Userprofile')

    class UserAddress(models.Model):
        address_contact=models.CharField(max_length=300,blank=False)
        address_line1=models.CharField(max_length=300,blank=False)
        address_line2=models.CharField(max_length=300,blank=True)
        land_mark=models.CharField(max_length=100,blank=False)
        city=models.CharField(max_length=140,blank=False)
        state=models.CharField(max_length=100,blank=False)
        pin_code = models.BigIntegerField(blank=False)
        mobile_no=models.CharField(max_length=13,blank=True)
        last_shipped_flag=models.BooleanField(default=False)
        is_active_flag=models.BooleanField(default=True)
        is_primary=models.BooleanField(default=False)
        creation_date=models.DateTimeField(auto_now_add=True,editable=False,blank=False,null=True)
        updation_date=models.DateTimeField(auto_now=True,editable=False,blank=False,null=True)
        email=models.ForeignKey(UserProfile)


        def __str__(self):
            return self.address_contact


        class Meta:
            verbose_name=u'User Address'
            verbose_name_plural=u'User Addresses'

from models import CustomUser

class CustomUserAuth(object):

    def authenticate(self, username = None, password =None):
        try:
            user =CustomUser.objects.get(email=username)
            if user.check_password(password):
                return user
        except CustomUser.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            user=CustomUser.objects.get(pk=user_id)
            if user.is_active:
                return user
            return None
        except CustomUser.DoesNotExist:
            return None



我在settings.py文件中包含了以下行


    AUTH_USER_MODEL = 'user_management.CustomUser'

    AUTHENTICATION_BACKENDS = ('user_management.manager.CustomUserAuth',)

现在,为了进行故障排除,我运行python manage.py shell并导入表单

CustomUserCreationForm并将数据传递给它并尝试保存它。我也有同样的错误

 

    Traceback (most recent call last):
      File "", line 1, in 
      File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/forms.py", line 110, in save
        user = super(UserCreationForm, self).save(commit=False)
      File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 459, in save
        if self.errors:
      File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py", line 175, in errors
        self.full_clean()
      File "/usr/local/lib/python2.7/dist-packages/django/forms/forms.py", line 386, in full_clean
        self._post_clean()
      File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 413, in _post_clean
        self.instance.full_clean(exclude=exclude, validate_unique=False)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 1235, in full_clean
        self.clean()
      File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/models.py", line 349, in clean
        self.email = self.__class__.objects.normalize_email(self.email)
      File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 198, in __get__
        cls._meta.swapped,
    AttributeError: Manager isn't available; 'auth.User' has been swapped for 'user_management.CustomUser'

共有1个答案

宣熙云
2023-03-14

不确定这是否相关,但您是否在def get_full_name(self)中正确获取了用户配置文件:

a=UserProfile.objects.get(email_id=self.id)

但是,我没有看到在您的类userprofile中指定email_id。您指定了email,并且这个类是从models.model子类的,默认情况下,我希望只有一个id列而不是email_id,除非您更改了它。

只是一个想法。

 类似资料:
  • 我正在尝试从Ldap服务器对用户进行身份验证。 以下是我的Ldap用户: 我的管理员的路径是cn=admin,dc=ldap,dc=agem,dc=com 我错过了什么?

  • 我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。 因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证 在握手期间,客户端会出示其证书并进行身份验证,因为服务

  • 授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用

  • 在向令牌端点发起请求时,机密客户端或其他被颁发客户端凭据的客户端必须如2.3节所述与授权服务器进行身份验证。客户端身份验证用于: 实施刷新令牌和授权码到它们被颁发给的客户端的绑定。当授权码在不安全通道上向重定向端点传输时,或者 当重定向URI没有被完全注册时,客户端身份验证是关键的。 通过禁用客户端或者改变其凭据从被入侵的客户端恢复,从而防止攻击者滥用被盗的刷新令牌。改变单套客户端凭据显然快于撤销

  • 如果客户端类型是机密的,客户端和授权服务器建立适合于授权服务器的安全性要求的客户端身份验证方法。授权服务器可以接受符合其安全要求的任何形式的客户端身份验证。 机密客户端通常颁发(或建立)一组客户端凭据用于与授权服务器进行身份验证(例如,密码、公/私钥对)。授权服务器可以与公共客户端建立客户端身份验证方法。然而,授权服务器不能依靠公共客户端身份验证达到识别客户端的目的。 客户端在每次请求中不能使用一

  • 有时需要对某些网络资源(如Servlet、JSP等)进行访问权限验证,也就是说,有访问权限的用户才能访问该网络资源。进行访问权限验证的方法很多,但通过HTTP响应消息头的WWW-Authenticate字段进行访问权限的验证应该是众多权限验证方法中比较简单的一个。 通过HTTP响应消息头的WWW-Authenticate字段可以使浏览器出现一个验证对话框,访问者需要在这个对话框中输入用户名和密码,