Django: схожу с ума и дергаю себя за волосы с помощью Django auth - PullRequest
2 голосов
/ 19 февраля 2010

Я создаю SAAS как проект, и, похоже, не могу обернуть мой мозг динозавра вокруг этой системы аутентификации. Я начал катить свою собственную систему, прежде чем понял, что вы можете добавить к обычной системе аутентификации. Это совершенно неправильно? Должен ли я как-то расширить модель User, но при этом включить все свои собственные атрибуты (имя пользователя, пароль и т. Д.)?

from django.db import models
from django.contrib.auth.models import User
from annoying.fields import AutoOneToOneField
from myproject.core.modelfields import LowerAlphanumericField
from myproject.apps.account.models import Account

class Administrator(models.Model):
    """
    Administrator for an Account (application holds multiple accounts as it is a SAAS).
    """
    account = models.ForeignKey(Account)
    user = AutoOneToOneField(User, primary_key=True)
    name = models.CharField(max_length=255)
    email = models.EmailField()
    username = LowerAlphanumericField(max_length=30)
    password = models.CharField(max_length=255)

Если я посещаю http://127.0.0.1:8080/admin/auth/user/3/, я получаю сообщение об ошибке, но первичным ключом для третьего созданного мной объекта администратора является 3 (который, как можно предположить, является первичным ключом для соответствующего объекта пользователя. Я что-то упустил. Кроме того, мне нужно создать поле пароля и все это барахло здесь, или, скорее, я должен?

Ответы [ 2 ]

4 голосов
/ 19 февраля 2010

Мне кажется, что вам не нужно добавлять столько дополнительной информации. Django auth охватывает все аспекты, которые вы ищете:

  • имя пользователя * * 1004
  • пароль (хэш sha1)
  • 1008 * Firstname *
  • 1010 * Фамилия *
  • Адрес электронной почты

и Django auth также имеет довольно полезную систему разрешений:

  • суперпользователя
  • Персонал

Всякий раз, когда я хочу добавить дополнительную информацию к объекту пользователя, я обычно создаю новую модель и сохраняю ссылку на пользователя.

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    # Extra functionality

А затем следуйте советам @bste и добавьте AUTH_PROFILE_MODULE = 'accounts.UserProfile' в файл настроек. Это позволяет вам получить доступ к профилю пользователя (вашей дополнительной информации) с помощью метода get_profile() для любого объекта User.

2 голосов
/ 19 февраля 2010

вы уже используете встроенную аутентификацию django ? если да, то вы можете указать модель, связанную с моделью пользователя, в которой вы можете хранить дополнительную информацию о пользователях. это объясняется здесь: http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

это просто добавить следующую строку:

AUTH_PROFILE_MODULE = 'accounts.Adminstrator'

нет необходимости хранить пароль самостоятельно, я думаю, что django делает это

...