2017-10-15 51 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