2012-09-14 32 views
6

Tôi đã tạo người dùng khi sử dụng lệnh syncdb và nó đăng nhập hoàn hảo. Nhưng khi tôi tạo một người dùng từ quản trị django, nó được tạo thành công nhưng gây ra lỗi khi đăng nhập. Tôi gặp lỗi:Tại sao mật khẩu người dùng không bị bẻ khóa trong quản trị django?

Unknown password hashing algorithm 'password'. Did you specify it in the PASSWORD_HASHERS setting? 

Sự cố là gì? làm thế nào tôi có thể giải quyết nó để mật khẩu được tự động mã hóa khi lưu người dùng trong quản trị?

Trả lời

0

Django không lưu trữ mật khẩu dưới dạng văn bản thuần. Nó lần đầu tiên băm chúng và chúng lưu trữ băm. Vì vậy, khi người dùng đăng nhập, Django áp dụng cùng hàm băm cho đầu vào của người dùng và sau đó so sánh hai băm - từ đầu vào của người dùng và những gì được lưu trữ trong db.

Tuy nhiên để làm cho mọi thứ linh hoạt hơn, Django không lưu trữ mật khẩu băm, cũng như vậy nhưng ngoài ra, nó cũng lưu trữ thuật toán mà băm được tạo ra. Hãy tưởng tượng kịch bản này - bạn sử dụng hàm băm X để tạo ra các băm mật khẩu, nhưng sau đó bạn nhận ra rằng hàm đó không còn an toàn vì bất kỳ lý do gì và bạn chuyển sang hàm băm Y. Tuy nhiên, đó là một vấn đề bởi vì tại thời điểm, băm mật khẩu của ai được lưu trữ bằng cách sử dụng hàm X, chúng sẽ không thể đăng nhập được nữa. Đó là lý do tại sao Django cũng lưu trữ các phương pháp mà theo đó đã được tạo ra, ngoài các giá trị băm chính nó. Thực tế là Django lưu trữ phương thức mà băm được tạo ra trong db, khi đọc giá trị, nó không thực sự nói cho Django biết cách thực thi hàm băm. Vì vậy, PASSWORD_HASHERS giống như một người lập bản đồ giữa hàm băm Python (thực ra là một lớp nhưng dù sao ...) và giá trị được lưu trữ trong db.

Quay lại câu hỏi của bạn. Thông báo lỗi có nghĩa là Django không nhận thức được hàm băm password được sử dụng để lưu trữ băm mật khẩu trong cơ sở dữ liệu của bạn hoặc ít nhất là không có trong số PASSWORD_HASHERS.

Tôi có thể nghĩ đến một vài lý do khiến điều đó có thể xảy ra.

  • Hãy chắc chắn rằng sau đó bạn làm syncdb, nó sử dụng cùng một tập tin settings.py như khi bạn đang chạy các máy chủ để truy cập admin. Nó có thể là trường hợp các cài đặt khác nhau được sử dụng.

  • Tuy nhiên, nhà phát triển thường không sửa đổi PASSWORD_HASHERS trong settings.py và chỉ sử dụng giá trị mặc định. Trong trường hợp đó, hãy đảm bảo bạn đang sử dụng cùng một Python với cùng phiên bản đã cài đặt của Django khi bạn thực hiện syncdb và khi bạn chạy máy chủ. Nếu bạn làm syncdb trong một virtualenv, ví dụ, và chạy máy chủ trong env khác nhau, sau đó phiên bản Django có thể khác nhau, do đó họ có thể có cài đặt khác nhau cho PASSWORD_HASHERS và do đó bạn chạy syncdb, nó có thể sử dụng hàm băm không được định nghĩa khi bạn chạy máy chủ.

+0

Bạn có thể đọc thêm về cách Django lưu trữ mật khẩu tại https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords hoặc đọc toàn bộ trang để nhận hiểu rõ hơn về cách hoạt động của công cụ Django auth, bao gồm xác thực người dùng. – miki725

4

Tôi gặp vấn đề tương tự trong trường hợp tôi đã phân lớp người dùng của Django, sau đó tạo mô hình quản trị viên và sử dụng biểu mẫu quản trị Django được tạo tự động để tạo người dùng.

Vì vậy, tôi đã có một cái gì đó như thế này trong models.py tôi

class Employee(User): 
    job = models.CharField(max_length=100) 

và điều này trong quản trị của tôi.py

class EmployeeAdmin(admin.ModelAdmin): 
    pass 
admin.site.register(Employee, EmployeeAdmin) 

Bây giờ Django tự động tạo biểu mẫu để thêm nhân viên mới vào quản trị viên Django. Nhưng khi biểu mẫu này được sử dụng để tạo người dùng, mật khẩu sẽ không bị băm. Vì vậy, đối với một số lý do, Django tạo trường nhập văn bản thông thường cho mật khẩu khi mô hình được bắt nguồn từ Người dùng tích hợp của Django. Tôi không biết nếu bạn có cùng một trường hợp.

Rất tiếc, tôi không thể tìm thấy giải pháp dễ dàng để khắc phục vấn đề này. Tôi cũng không có ý tưởng tại sao Django không tạo ra trường biểu mẫu chính xác cho mật khẩu tự động. Tuy nhiên, một khả năng có thể là ghi đè biểu mẫu tự động bằng một biểu mẫu tùy chỉnh bao gồm tiện ích mật khẩu. Xem https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides.

+0

bạn cần mở rộng UserAdmin, không phải ModelAdmin –

2

Tôi gặp phải sự cố tương tự được hiển thị trong câu trả lời có phần nổi bật và cũng có thể là vấn đề của bạn.

Vấn đề xảy ra khi kế thừa mô hình của tôi sử dụng từ django.contrib.admin.ModelAdmin thay vì django.contrib.auth.admin.UserAdmin

Bằng cách này, tôi đã bỏ qua chức năng sử dụng necesary

2

Giải pháp cho mật khẩu được lưu trữ dưới dạng văn bản chứ không phải là mật khẩu băm được sử dụng UserAdmin từ django.contrib.auth.admin thay vì ModelAdmin.

from django.contrib.auth.admin import UserAdmin 

class EmployeeAdmin(UserAdmin): 
    pass 

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