2013-03-20 13 views
15
  • Pythonの3
  • Djangoの1.5
  • のPostgreSQL 5.0.3

私はを利用しDjangoのアプリを作ってるんだDjangoの&に新たなんですAbstractUserですが、Django管理者でユーザーを作成し、管理者のユーザー情報を見ると、パスワードがプレーンテキストで表示されます。 DBで直接チェックすると、パスワードがプレーンテキストとして確実に保存されていることがわかります。Djangoの管理者でないハッシュカスタム・ユーザー・パスワードが

認証を行うためにいくつかのビューを作成しようとしていますが、ユーザー名とパスワードが正しい場合でも動作しません。だから私はauthenticate()関数がハッシュですが、パスワードが実際にハッシュされていないのでNoneを返すと推測しています。

パスワードがハッシュ化されない理由はありますか?

私はいくつかのコードを投稿したいと思いますが、私のモデルはパスワードフィールドを持つコードを含んでいないので、どんなコードも助けになるとは思われません。(& Djangoによって行われました。私がやっていることやしていないことがあれば、私は自分の設定、モデル、管理者などからすべてを投稿しなければならないコードの部分を知りません。

答えて

2

それはデータベースに直接保存されます。したがって、パスワードを保存する前に、パスワードをハッシュする方法をオーバーライドする必要があります。これをフォームに追加してください:

def save(self, commit=True): 
    # Save the provided password in hashed format 
    user = super(MyForm, self).save(commit=False) 
    user.set_password(self.cleaned_data["password"]) 
    if commit: 
     user.save() 
    return user 
+0

私は(私は、Djangoの管理者によって生成されたものを使用しています)の任意のフォームを作っていないので、私のフォームがどこにあるか私はかなり理解していません。私はそれを私のadmin.pyに入れますか? – Zamphatta

+0

いいえ別のファイルに存在する必要があります。 – catherine

8

admin.pyファイルにフォームコードを追加できます。ただし、save()メソッドだけでなく、UserAdmin降順クラスの定義も、フォームクラスの定義を追加する必要があります。私は例が明確になると思う:

class UserCreationForm(forms.ModelForm): 
    class Meta: 
     model = CustomUser 
     fields = ('email',) 

    def save(self, commit=True): 
     # Save the provided password in hashed format 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password"]) 
     if commit: 
      user.save() 
     return user 


class CustomUserAdmin(UserAdmin): 
    # The forms to add and change user instances 
    add_form = UserCreationForm 
    list_display = ("email",) 
    ordering = ("email",) 

    fieldsets = (
     (None, {'fields': ('email', 'password', 'first_name', 'last_name')}), 
     ) 
    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('email', 'password', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active')} 
      ), 
     ) 

    filter_horizontal =() 

    admin.site.register(CustomUser, CustomUserAdmin) 

これはあなたを開始するはずです。クラスのフィールドをユーザークラスのフィールドに合わせてカスタマイズする必要があります。

詳細情報はこちら:https://docs.djangoproject.com/en/dev/topics/auth/customizing/

8

私は問題はあなたadmin.pyにdjango.contrib.auth.adminからModelAdminの代わりにUSERADMINを継承していることであると思います。

サンプルコード:

from django.contrib.auth.admin import UserAdmin 
from .models import Employee 

class EmployeeAdmin(UserAdmin): 
    pass 

admin.site.register(Employee, EmployeeAdmin) 
関連する問題