2013-09-24 27 views
5

正常に作成されたスーパーユーザでdjango管理パネルにログインしようとしていますが、正しいusername/pwコンボ権が得られません。カスタムユーザモデルでスーパーユーザを作成した後にdjango adminにログインできません

私はユーザーに自分のユーザー名として電子メールを使用させたいと思っています。私もDjangoのドキュメントhereの例を複製するために最善を尽くしました。移行、sycndbを削除しましたが、管理パネルにログインする以外はすべて動作します。

関連コード: models.pyから:

from django.db import models 
from django.forms import ModelForm 
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser 

class UserManager(BaseUserManager): 
    def create_user(self, email, password=None): 
     """ 
     Creates and saves a User with the given email 
     """ 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      email=UserManager.normalize_email(email), 
     ) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, password): 
     """ 
     Creates and saves a superuser with the given email, date of 
     birth and password. 
     """ 
     user = self.create_user(email, 
      password=password 
     ) 

     user.is_admin = True 
     user.is_staff = True 
     user.is_superuser = True 
     user.save(using=self._db) 
     return user 



class User(AbstractBaseUser): 
    objects = UserManager() 
    date_added = models.DateField(auto_now=False, auto_now_add=True) 
    email = models.EmailField(unique=True, db_index=True) 
    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = [] 

    def __unicode__(self): 
     return self.email 

    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    def get_full_name(self): 
    # The user is identified by their email address 
     return self.email 

    def get_short_name(self): 
    # The user is identified by their email address 
     return self.email 

    # On Python 3: def __str__(self): 
    def __unicode__(self): 
     return self.email 

    def has_perm(self, perm, obj=None): 

    # Simplest possible answer: Yes, always 
     return True 

    def has_module_perms(self, app_label): 

    # Simplest possible answer: Yes, always 
     return True 

    def is_staff(self): 

    # Simplest possible answer: All admins are staff 
     return self.is_admin 

admin.pyより:

from django.contrib import admin 
from app.models import Relationship, Event, User 
from django import forms 
from django.contrib import admin 
from django.contrib.auth.models import Group 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import ReadOnlyPasswordHashField 


class UserCreationForm(forms.ModelForm): 
    """A form for creating new users. Includes all the required 
    fields, plus a repeated password.""" 

    password1 = forms.CharField(label='Password', widget=forms.PasswordInput) 
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) 

    class Meta: 
     model = User 
     fields = ('email',) 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 


class UserChangeForm(forms.ModelForm): 
    password = ReadOnlyPasswordHashField() 

    class Meta: 
     model = User 

    def clean_password(self): 
     return self.initial["password"] 





class UserAdmin(UserAdmin): 
    # The forms to add and change user instances 
    form = UserChangeForm 
    add_form = UserCreationForm 


    list_display = ('email', 'is_admin') 
    list_filter = ('is_admin',) 
    fieldsets = (
     (None, {'fields': ('email', 'password')}), 
     ('Permissions', {'fields': ('is_admin',)}), 
    ) 

    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('email', 'password1', 'password2')} 
     ), 
    ) 
    search_fields = ('email',) 
    ordering = ('email',) 
    filter_horizontal =() 

admin.site.register(User, UserAdmin) 
admin.site.unregister(Group) 

関連settings.pyコード:スーパーユーザを作成し、それを見てから

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.contrib.auth.middleware.RemoteUserMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

ROOT_URLCONF = 'relrem.urls' 

# Python dotted path to the WSGI application used by Django's runserver. 
WSGI_APPLICATION = 'relrem.wsgi.application' 

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
    'app', 
    'south', 

    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
) 

AUTH_USER_MODEL = 'app.User' 

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.RemoteUserBackend', 
) 

サンプル端子出力表:

Email: [email protected] 
Password: 
Password (again): 
Superuser created successfully. 

[ 
{ 
"pk": 1, 
"model": "app.user", 
"fields": { 
    "is_active": true, 
    "last_login": "2013-09-24T02:09:44.996Z", 
    "is_admin": true, 
    "date_added": "2013-09-23", 
    "password": "", 
    "email": "[email protected]" 
} 
} 
] 

私は私は何をすべきかに関係なく、私は「スタッフのアカウントの正しいメールアドレスとパスワードを入力してくださいますので、パスワードが保存され、返却されている方法とは何かでなければならないと思います。 "pw"のハッシュに関連するすべてのコードを削除して、それを掃除しようとしましたが、実際にはまだハッシュ値が返されています。ユーザテーブル。

私はこの全体の問題に目を通すには時間がかかります誰にも事前のおかげで、私は何か明白間違ってやっている願っています。

答えて

9

コードは大丈夫です。問題は、あなたが使用しているありますRemoteUserBackend独占的に、代わりのdefault backend

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.RemoteUserBackend', 
) 

私はそれを自分自身使ったことがないが、from the docsリクエストのREMOTE_USERヘッダだけをチェックするだけで、パスワードのログイン試行は無関係になることは明らかです。

あなたが利用できる両方持つことwan't場合は、フォールバックとしてデフォルトModelBackendを追加することができます。

AUTHENTICATION_BACKENDS = (
     'django.contrib.auth.backends.RemoteUserBackend', 
     'django.contrib.auth.backends.ModelBackend', 
) 

またはalltogether RemoteUserBackendを取り除くと、あなたのアプリがデフォルトの方法を認証しています。

これが役に立ちます。

+0

残念ながら、それを見ていただきありがとうございます。同じ問題があります。 AUTHENTICATION_BACKEND行とRemoteUserに関連するものを削除しましたが、まだログインできません。 – berserkia

+0

@berserkia AUTHENTICATION_BACKENDSに 'django.contrib.auth.backends.ModelBackend'も追加しましたか?質問を更新して現在のsettings.pyを表示できますか? – kirbuchi

+0

それは、感謝@キルブチ、それを持っています。 – berserkia

関連する問題