2013-03-20 33 views
15
  • Python 3
  • Django 1,5
  • PostgreSQL 5.0.3

Tôi mới đến Django & Tôi đang thực hiện một ứng dụng Django mà làm cho sử dụng AbstractUser, nhưng khi tôi tạo một người dùng trong quản trị Django, và sau đó nhìn vào thông tin của người dùng trong quản trị viên, tôi thấy mật khẩu ở dạng văn bản thuần túy. Kiểm tra trực tiếp trong DB, tôi thấy mật khẩu chắc chắn đang được lưu trữ dưới dạng bản rõ.Django Quản trị Không Băm Tuỳ chỉnh tài khoản Mật khẩu

Tôi đang cố gắng viết một số chế độ xem để thực hiện một số xác thực, nhưng nó không hoạt động ngay cả khi tên người dùng và mật khẩu chính xác. Vì vậy, tôi đoán rằng các chức năng authenticate() là băm nhưng trả về None vì mật khẩu không thực sự băm.

Có bất kỳ lý do nào có thể khiến mật khẩu không bị băm không?

Tôi sẽ đăng một số mã, nhưng tôi không nghĩ mã nào sẽ giúp ích, vì mô hình của tôi không bao gồm bất kỳ mã nào hoạt động với trường mật khẩu (được tạo bởi & do Django thực hiện). Nếu có điều gì đó tôi đang làm hoặc không làm, tôi thậm chí sẽ không biết phần nào của mã nó sẽ có trong đó vì vậy tôi phải đăng mọi thứ từ cài đặt, mô hình, quản trị viên, v.v.

Trả lời

2

Vì nó lưu trực tiếp vào cơ sở dữ liệu. Vì vậy, trước khi nó lưu bạn phải ghi đè lên phương pháp để băm mật khẩu. Thêm mục này vào biểu mẫu của bạn:

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

tôi đã không thực hiện bất kỳ hình thức (Tôi đang sử dụng những cái tạo bởi admin của Django), vì vậy tôi không hoàn toàn hiểu nơi hình thức của tôi là. Tôi có đặt nó trong admin.py của tôi không? – Zamphatta

+0

không có tệp nào trong tệp riêng biệt, đặt tên là forms.py – catherine

8

Bạn có thể thêm mã biểu mẫu vào tệp admin.py. Bạn sẽ, tuy nhiên, cũng cần phải thêm định nghĩa của lớp biểu mẫu, không chỉ là phương thức save() và cũng là định nghĩa của lớp người dùng gốc củaAdmin. Tôi nghĩ rằng ví dụ sẽ làm rõ:

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) 

Điều này sẽ giúp bạn bắt đầu. Bạn sẽ cần phải tùy chỉnh các trường của các lớp để phù hợp với các trường của lớp người dùng của bạn.

Thông tin thêm là ở đây: https://docs.djangoproject.com/en/dev/topics/auth/customizing/

8

Tôi đoán vấn đề là bạn thừa hưởng ModelAdmin thay vì UserAdmin từ django.contrib.auth.admin trong admin.py của bạn.

Mẫu mã:

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

class EmployeeAdmin(UserAdmin): 
    pass 

admin.site.register(Employee, EmployeeAdmin) 
Các vấn đề liên quan