2017-10-15 119 views
0

我有以下的用户在我的Django应用程序:
1.(UUID,电子邮件,姓名,地址,密码)
2.远程应用(UUID,名称,生成随机密码)普通用户
3.(其它类型的远程应用程序)
Django的:自定义用户

对于普通用户将与网页邮箱+密码 用于远程应用程序的认证将与UUID +随机秘密与JSON索要临时令牌

认证

我没有知道如何在Django中处理这个问题。我想从AbstractBaseUser如创建AuthBaseUser:

class AuthBaseUser(AbstractBaseUser, PermissionsMixin): 
    pk = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False,) 
    name = models.CharField(_('name'), max_length=128, blank=False) 
    typ = models.CharField(max_length=16, choices=USER_TYPES, default='normaluser',) 
    date_joined = models.DateTimeField(_('date joined'), auto_now_add=True, default=timezone.now) 
    last_login = models.DateTimeField(_('last login'), auto_now_add=True) 
    is_active = models.BooleanField(_('active'), default=True) 

然后,我想创造一个RemoteAppUser和NormalUser以1:1级的映射是这样的:

class NormalUser(AuthBaseUser): 
    user = models.OneToOneField(AuthBaseUser, on_delete=models.CASCADE) 
    email = models.EmailField(_('email address'), unique=True) 
    is_superuser = models.BooleanField(_('superuser'), default=True) 
    #password = #not decided yet what to add here; for remote app we will have 256b of SHA256's random generated value 

    EMAIL_FIELD = 'email' 
    REQUIRED_FIELDS = AuthBaseUser.REQUIRED_FIELDS.append(['email', 'password', ]) 

    objects = NormalUserManager() 

    def __init__(self, *args, **kwargs): 
     super(AuthBaseUser, self).__init__(*args, **kwargs) 

    def __str__(self): 
     return self.get_username() 

    def get_full_name(self): 
     return self.get_username() 

    def get_short_name(self): 
     return self.get_username() 

当然,我要补充的缺省auth用户:

AUTH_USER_MODEL = 'myauth.AuthBaseUser' 

有没有推荐的方法来处理这种不同的用户? 注意,比如我想保存的RemoteApp的秘密作为SHA256,但我并不需要与种子运行排列几次等

回答

0

可能只是创造一些这样的:

class User(AbstractBaseUser, PermissionsMixin): 
    name = models.CharField(_('name'), max_length=128, blank=False) 
    is_normal = models.BooleanField(default=False) 
    is_other = models.BooleanField(default=False) 

和一类两种类型的认证,而只是检查is_normal用户或用户is_other

UPDATE:

尝试这样的:

class EnterpriseEntry(models.Model): 
    user = models.ForeignKey('User', null=False, blank=False, verbose_name=u'Пользователь', 
         related_name='enterprise_entries') 
    position = models.CharField(
    max_length=100, default="", blank=True, verbose_name=u'Позиция в компании') 

    ADMIN_ENTERPRISE = 0 
    USER = 1 
    ENTREPRENEUR = 2 
    UNKNOWN = 3 
    MODERATOR = 4 

    PROFILE_TYPES = (
     (ADMIN_ENTERPRISE, u'Руководитель юридического лица'), 
     (USER, u'Пользователь приглашенный в предприятие'), 
     (ENTREPRENEUR, u'Индивидуальный предприниматель'), 
     (MODERATOR, u'Модератор компании'), 
     (UNKNOWN, u'Не известно'), 
    ) 
+0

我认为这是与我提供的解决方案/概念相同,除了bool“is_normal”和bool“is_other”,我使用了enum“typ”值(“normaluser”,“remoteapp” “admin”,...) – majvan