2012-09-14 82 views
6

मैंने syncdb कमांड का उपयोग करते समय एक उपयोगकर्ता बनाया और यह पूरी तरह से लॉग इन करता है। लेकिन जब मैं Django व्यवस्थापक से एक उपयोगकर्ता बनाने के लिए, यह सफलतापूर्वक बनाया गया लेकिन त्रुटि होती है जब यह में प्रवेश करने मैं त्रुटि मिलती है:।django admin में उपयोगकर्ता पासवर्ड क्यों नहीं डाला जा रहा है?

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

समस्या क्या है? मैं इसे कैसे हल कर सकता हूं ताकि उपयोगकर्ता को व्यवस्थापक में सहेजते समय पासवर्ड स्वचालित रूप से एन्क्रिप्ट किया जा सके?

उत्तर

0

Django सादे-पाठ के रूप में पासवर्ड की दुकान नहीं है। यह पहले उन्हें धो देता है और वे हैश स्टोर करता है। तो जब उपयोगकर्ता लॉग इन करता है, तो Django उपयोगकर्ताओं के इनपुट में एक ही हैश फ़ंक्शन लागू करता है और फिर दो हैंश की तुलना करता है - उपयोगकर्ताओं के इनपुट से और डीबी में संग्रहीत किया जाता है।

हालांकि बातें और अधिक लचीला बनाने के लिए, जैंगो पासवर्ड हैश की दुकान नहीं है, अच्छा किया है, लेकिन इसके अलावा, यह भी एल्गोरिथ्म है जिसके द्वारा हैश उत्पन्न की गई संग्रहीत करता है। इस परिदृश्य की कल्पना करें - पासवर्ड हैश उत्पन्न करने के लिए हैश फ़ंक्शन X का उपयोग करें, लेकिन फिर आप महसूस करते हैं कि यह फ़ंक्शन किसी भी कारण से सुरक्षित नहीं है और आप हैशिंग फ़ंक्शन Y पर स्विच करते हैं। हालांकि यह एक समस्या है क्योंकि बिंदु पर, जो भी पासवर्ड हैश फ़ंक्शन X का उपयोग करके संग्रहीत किया जाता है, वे अब लॉगिन नहीं कर पाएंगे। यही कारण है कि Django भी हैश मूल्य के अलावा, जिस तरह से उत्पन्न किया गया था, उस विधि को संग्रहीत करता है। यह वह जगह है जहां PASSWORD_HASHERS सेटिंग आती है। तथ्य यह है कि डीजेगो उस विधि को संग्रहीत करता है जिसके द्वारा डीबी में हैश उत्पन्न होता है, जब मूल्य पढ़ते हैं, तो यह वास्तव में डैंजो को यह नहीं बताता है कि हैश फ़ंक्शन को कैसे कार्यान्वित किया जाए। तो PASSWORD_HASHERS हैशिंग पायथन फ़ंक्शन (वास्तव में एक वर्ग लेकिन वैसे भी ...) और डीबी में संग्रहीत मान के बीच एक मैपर की तरह है।

तो अपने प्रश्न के लिए वापस। त्रुटि संदेश का अर्थ है कि Django हैशिंग समारोह password जो PASSWORD_HASHERS में अपने डेटाबेस में पासवर्ड के हैश स्टोर करने के लिए इस्तेमाल किया गया था, या कम से कम अपनी नहीं के बारे में पता नहीं है।

मैं कारण है कि हो सकता है की जोड़ी के बारे में सोच सकते हैं।

  • सुनिश्चित करें कि फिर तुम syncdb करते हैं, यह के रूप में जब आप व्यवस्थापक तक पहुँचने के लिए सर्वर चला रहे हैं एक ही settings.py फ़ाइल का उपयोग करता है सुनिश्चित करें। यह मामला हो सकता है कि विभिन्न सेटिंग्स का उपयोग किया जाता है।

  • हालांकि डेवलपर आमतौर पर PASSWORD_HASHERS को settings.py में संशोधित नहीं करते हैं और केवल डिफ़ॉल्ट मान का उपयोग करते हैं। उस स्थिति में, सुनिश्चित करें कि आप उसी पाइथन का उपयोग Django के उसी स्थापित संस्करण के साथ कर रहे हैं जब आप syncdb करते हैं और जब आप सर्वर चलाते हैं। आप एक virtualenv, उदाहरण के लिए, और विभिन्न env में रन सर्वर में syncdb करते हैं, तो Django संस्करणों अलग हो सकता है, इसलिए वे PASSWORD_HASHERS लिए भिन्न सेटिंग हो सकता है और इसलिए जहां syncdb चलाने के लिए, यह एक हैशिंग समारोह जो नहीं है का उपयोग कर किया जा सकता है जब आप सर्वर चलाते हैं तो परिभाषित किया जाता है।

+0

आप https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords पर कैसे Django भंडार पासवर्ड के बारे में और अधिक पढ़ या एक पाने के लिए पूरे पृष्ठ पढ़ सकते हैं Django ऑथ कैसे काम करता है, इसकी बेहतर समझ, जिसमें उपयोगकर्ता प्रमाणीकरण शामिल है। – miki725

4

मैं एक स्थिति मैं कहाँ subclassed था Django के उपयोगकर्ता में एक ही समस्या में पड़ गए, तो यह के लिए एक मॉडल व्यवस्थापक बनाया है और स्वचालित रूप से उत्पन्न Django व्यवस्थापक फार्म का उपयोग किया एक उपयोगकर्ता बनाने के लिए।

तो मैं अपने व्यवस्थापक में अपने models.py

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

में कुछ इस तरह था और यह।py

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

अब Django स्वचालित रूप से Django व्यवस्थापक में नए कर्मचारियों को जोड़ने के लिए एक फार्म बनाता है। लेकिन जब इस फॉर्म का उपयोग उपयोगकर्ता बनाने के लिए किया जाता है, तो पासवर्ड बिल्कुल भी नहीं मिलेगा। तो किसी कारण से, Django पासवर्ड के लिए सामान्य टेक्स्ट इनपुट फ़ील्ड बनाता है जब मॉडल Django के अंतर्निर्मित उपयोगकर्ता से प्राप्त होता है। मुझे नहीं पता कि आपके पास एक ही मामला है या नहीं।

दुर्भाग्यवश मुझे इसे ठीक करने का आसान समाधान नहीं मिला। मुझे यह भी नहीं पता कि Django स्वचालित रूप से पासवर्ड के लिए सही फॉर्म फ़ील्ड क्यों नहीं बना रहा है। हालांकि एक संभावना स्वचालित रूप से एक कस्टम फॉर्म के साथ ओवरराइड करना होगा जिसमें एक पासवर्ड विजेट शामिल होगा। https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides देखें।

+0

आपको ModelAdmin नहीं, UserAdmin का विस्तार करने की आवश्यकता है –

2

मुझे रूबीनस उत्तर में दिखाया गया एक ही समस्या का अनुभव हुआ और आपकी समस्या भी हो सकती है।

समस्या हुआ जब django.contrib.auth.admin.UserAdmin

के बजाय django.contrib.admin.ModelAdmin से मेरे उपयोगकर्ता मॉडल इनहेरिट ऐसा करने से, मैं

2

पासवर्ड के लिए समाधान के बजाय टुकड़ों में बंटी पासवर्ड से पाठ के रूप में संग्रहीत किया जा रहा आवश्यक उपयोगकर्ता कार्यक्षमता को दरकिनार किया गया था UserAdmin उपयोग करने के लिए है ModelAdmin के बजाय django.contrib.auth.admin से।

from django.contrib.auth.admin import UserAdmin 

class EmployeeAdmin(UserAdmin): 
    pass 

admin.site.register(Employee, EmployeeAdmin) 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^