5

django アプリの User モデルを作成しました

class User(Model):
    """
    The Authentication model. This contains the user type.  Both Customer and
    Business models refer back to this model.
    """
    email = EmailField(unique=True)
    name = CharField(max_length=50)
    passwd = CharField(max_length=76)
    user_type = CharField(max_length=10, choices=USER_TYPES)
    created_on = DateTimeField(auto_now_add=True)
    last_login = DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.email

    def save(self, *args, **kw):
        # If this is a new account then encrypt the password.
        # Lets not re-encrypt it everytime we save.
        if not self.created_on:
            self.passwd = sha256_crypt.encrypt(self.passwd)
        super(User, self).save(*args, **kw)

このモデルを使用するための認証ミドルウェアも作成しました。

from accounts.models import User
from passlib.hash import sha256_crypt

class WaitformeAuthBackend(object):
    """
    Authentication backend fo waitforme
    """

    def authenticate(self, email=None, password=None):
        print 'authenticating : ', email
        try:
            user = User.objects.get(email=email)
        except User.DoesNotExist:
            user = None

        if user and sha256_crypt.verify(password, user.passwd):
            return user
        else:
            return None

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

settings.py ファイルを正しく修正しました。このバックエンドに print ステートメントを追加すると、ユーザーの詳細が出力されます。django docs で is_authenticated を実装する必要があることを読んだことを思い出しません。私は何かばかげたことを見逃していますか?

4

2 に答える 2

5

Djangoの組み込みモデルを使用してリンクされたUserProfileを追加する代わりに、新しいユーザーモデルを作成した理由がよくわかりません.これは推奨されることです(プラグ可能なユーザーモデルが利用可能になる1.5がリリースされるまで). is_authenticatedただし、はい、常に True を返すメソッドを定義する必要があります。これは、組み込みモデルが行うこととまったく同じです。その理由は、実際のユーザーがいる場合は常に認証されるためです。それ以外の場合は、AnonymousUser オブジェクトがあり、その is_authenticated メソッドは常に False を返します。

于 2012-11-03T10:28:21.440 に答える
2

車輪を再発明する必要はありません。Djangos ビルドの認証システムを使用するだけで、多くの手間を省くことができます。必要に応じて拡張したり、別の認証バックエンドを使用したりすることもできます。ここを読んでください。HTH。

于 2012-11-02T23:41:35.130 に答える