2013-08-29 62 views
24

Khi tôi tạo người dùng từ django-admin mật khẩu của người dùng được mã hóa. nhưng khi tôi tạo người dùng từ django shell user-pasword được lưu trong văn bản thuần túy. Ví dụ:Cách tạo người dùng từ django shell

{ 
    "date_joined": "2013-08-28T04:22:56.322185", 
    "email": "", 
    "first_name": "", 
    "id": 5, 
    "is_active": true, 
    "is_staff": false, 
    "is_superuser": false, 
    "last_login": "2013-08-28T04:22:56.322134", 
    "last_name": "", 
    "password": "pbkdf2_sha256$10000$iGKbck9CED0b$6hWrKYiMPNGKhcfPVGal2YP4LkuP3Qwem+2ydswWACk=", 
    "resource_uri": "/api/v1/user/5/", 
    "username": "user4" 
}, 
{ 
    "date_joined": "2013-08-29T01:15:36.414887", 
    "email": "[email protected]", 
    "first_name": "", 
    "id": 6, 
    "is_active": true, 
    "is_staff": true, 
    "is_superuser": true, 
    "last_login": "2013-08-29T01:15:36.414807", 
    "last_name": "", 
    "password": "123test", 
    "resource_uri": "/api/v1/user/6/", 
    "username": "test3" 
} 

Tôi cố gắng để làm cho REST của phong cách api cho một ứng dụng blog đơn giản: khi tôi cố gắng để chèn một người sử dụng qua đường bưu điện theo yêu cầu [bằng cách thông qua JSON] Mật khẩu được lưu lại dưới dạng văn bản đơn giản. cách ghi đè hành vi này.

+0

How are you đặt json vào db? –

+0

tôi đang sử dụng django-tastypie. – shifu

Trả lời

65

Bạn không nên tạo người dùng thông qua cú pháp User(...) bình thường, thêm những người khác đã đề xuất. Bạn nên luôn sử dụng User.objects.create_user(), việc này sẽ đảm bảo đặt đúng mật khẩu.

[email protected]> manage.py shell 
>>> from django.contrib.auth.models import User 
>>> user=User.objects.create_user('foo', password='bar') 
>>> user.is_superuser=True 
>>> user.is_staff=True 
>>> user.save() 
+0

vui lòng đọc câu hỏi đầy đủ bên dưới mã cũng – shifu

+2

Tôi không thấy câu hỏi "đầy đủ của bạn" xung đột với câu trả lời của tôi như thế nào. Nếu bạn cần tạo một người dùng trong mã, bạn nên sử dụng 'User.objects.create_user()'. –

+7

Và đối tượng người dùng ma thuật này đến từ đâu? H8 khi các mẫu mã được đưa ra mà không có bit 'nhập khẩu' rất quan trọng. 'django.contrib.auth.models' –

3

Bạn sử dụng user.set_password để đặt mật khẩu trong vỏ django. Tôi thậm chí không chắc chắn nếu trực tiếp thiết lập mật khẩu thông qua user.password thậm chí sẽ làm việc, kể từ khi Django hy vọng một băm mật khẩu.

Trường password không lưu mật khẩu; nó lưu trữ chúng dưới dạng <algorithm>$<iterations>$<salt>$<hash>, vì vậy khi nó kiểm tra mật khẩu, nó sẽ tính toán giá trị băm và so sánh nó. Tôi nghi ngờ người dùng thực sự có mật khẩu có băm mật khẩu được tính toán ở dạng <algorithm>$<iterations>$<salt>$<hash>.

Nếu bạn nhận được json với tất cả các thông tin cần thiết để tạo ra các tài khoản, bạn chỉ có thể làm

User.objects.create_user(**data) 

giả json bạn đã vượt qua được gọi là dữ liệu.

Lưu ý: Điều này sẽ gây ra lỗi nếu bạn có các mục thừa hoặc bị thiếu trong số data.

Nếu bạn thực sự muốn ghi đè lên hành vi này, bạn có thể làm

def override_setattr(self,name,value): 
    if name == 'password': 
     self.set_password(value) 
    else: 
     super().__setattr__(self,name,value) #or however super should be used for your version 

User.__setattr__ = override_setattr 

tôi đã không kiểm tra giải pháp này, nhưng nó phải làm việc. Sử dụng có nguy cơ của riêng bạn.

+0

có lẽ tôi cần ghi đè lưu mặc định cho Người dùng thực hiện điều đó. – shifu

+0

Tôi không nghĩ rằng bạn nên làm điều đó, vì nó là đối tượng User mặc định (có nghĩa là nếu bạn đã làm, nó sẽ vít trên tất cả mọi người khác bằng cách sử dụng User, trừ khi bạn subclassed). Có gì sai khi sử dụng 'set_password'? –

+0

sry, nhưng tôi đã thực hiện một số thay đổi cho câu hỏi ban đầu để làm cho nó liên quan nhiều hơn đến những gì tôi đang làm. – shifu

-6

Có vài cách để đặt mật khẩu cho đối tượng người dùng django từ django-shell.

user = User(username="django", password = "secret") 
user.save() 

Điều này sẽ lưu trữ mật khẩu được mã hóa.

user = User(username="django") 
user.set_password("secret") 
user.save() 

Điều này sẽ lưu trữ mật khẩu được mã hóa.

Nhưng,

user = User(username="django") 
user.password="secret" 
user.save() 

này sẽ lưu trữ mật khẩu văn bản đơn giản. Không có băm/mã hóa nào được áp dụng vì bạn đang sửa đổi trực tiếp thuộc tính.

+1

'người dùng = Người dùng (tên người dùng =" django ", mật khẩu =" bí mật ")' sẽ ** không ** làm việc như bạn mong đợi. Vui lòng xác minh lời khuyên trước khi chia sẻ. –

+0

Hey, tôi vừa bỏ lỡ gọi save() sau câu lệnh đầu tiên. Có gì khác sai ở đây không? –

+1

Ví dụ đầu tiên và thứ ba của bạn dẫn đến một đối tượng User vô dụng. Cách chính xác để đặt mật khẩu cho đối tượng Người dùng django là: 1 - gọi 'set_password' trên đối tượng Người dùng hiện có 2 - tạo đối tượng Người dùng với hàm trợ giúp' User.objects.create_user' Với cả hai các phương thức bạn chuyển vào mật khẩu trong cùng một biểu mẫu người dùng xác thực sẽ nhập nó, đảm bảo rằng kết hợp băm sẽ hoạt động khi họ tiếp tục cố đăng nhập. Nếu bạn đặt mật khẩu bằng hai ví dụ khác, người dùng sẽ không bao giờ có thể đăng nhập như kiểm tra băm sẽ không bao giờ vượt qua. –

0

Trả lời cho những người sử dụng django 1.9 trở lên kể từ from django.contrib.auth.models import User không được chấp nhận (thậm chí có thể sớm hơn) nhưng chắc chắn là 1.9.

Thay vì làm: trong bash:

python manage.py shell 

Trong vỏ python để tạo một người dùng với một mật khẩu:

from django.apps import apps 
User = apps.get_model('user', 'User') 
me = User.objects.create(first_name='john', email='[email protected]') # other_info='other_info', etc. 
me.set_password('WhateverIwant') # this will be saved hashed and encrypted 
me.save() 

Nếu đến từ một API có lẽ bạn nên áp dụng một Form như vậy :

import json 
User = get_model('User') 
class UserEditForm(BaseModelForm): 
     """This allows for validity checking...""" 

     class Meta: 
      model = User 
      fields = [ 
       'first_name', 'password', 'last_name', 
       'dob', # etc... 
      ] 
# collect the data from the API: 
post_data = request.POST.dict() 
data = { 
'first_name': post_data['firstName'], 
'last_name': post_data['firstName'], 
'password': post_data['password'], etc. 
} 
dudette = User() # (this is for create if its edit you can get the User by pk with User.objects.get(pk=kwargs.pk)) 
form = UserEditForm(data, request.FILES, instance=dudette) 
if form.is_valid(): 
    dudette = form.save() 
else: 
    dudette = {'success': False, 'message': unicode(form.errors)} 
return json.dumps(dudette.json()) # assumes you have a json serializer on the model called def json(self): 
+0

Lưu ý rằng tài liệu chính thức (https://docs.djangoproject.com/en/1.10/topics/auth/default/#creating-users) nhập mô hình người dùng từ 'django.contrib.auth.models'. Đánh giá bằng '' other_info' kwargs của bạn, bạn có thể muốn đề cập rằng ví dụ của bạn sử dụng mô hình người dùng tùy chỉnh. – Escher

+0

điều này có nghĩa là cho mục đích minh họa, như bạn cảm thấy thoải mái khi đặt bất kỳ thông tin nào mà Mô hình người dùng cụ thể của bạn có ở đây ... nhưng chắc chắn nếu ai đó theo nghĩa đen có "other_info" sẽ phải là mô hình Người dùng tùy chỉnh. – Zargold

1

Cách tạo siêu người dùng nhanh nhất cho django, nhập vào shell:

python manage.py createsuperuser 
1

Để tự động hóa tập lệnh, bạn có thể sử dụng tính năng đường ống để thực thi danh sách lệnh mà không phải nhập nó mỗi lần.

// content of "create_user.py" file 
from django.contrib.auth import get_user_model 

# see ref. below 
UserModel = get_user_model() 

if not UserModel.objects.filter(username='foo').exists(): 
    user=UserModel.objects.create_user('foo', password='bar') 
    user.is_superuser=True 
    user.is_staff=True 
    user.save() 

Ref: get_user_model()

Hãy nhớ để kích hoạt virtualenv đầu tiên, sau đó chạy lệnh dưới đây (đối với Linux):

cat create_user.py | python manage.py shell 

Nếu bạn sử dụng cửa sổ sau đó thay thế các mèo lệnh với nhập lệnh

type create_user.py | python manage.py shell 

HOẶC cho cả Linux và Windows

# if the script is not in the same path as manage.py, then you must 
# specify the absolute path of the "create_user.py" 
python manage.py shell < create_user.py 
0

Để tạo Người dùng thực hiện:

$ python manage.py shell 
>>>> from django.contrib.auth.models import User 
>>>> user = User.objects.create_user('USERNAME', 'MAIL_NO_REQUIRED', 'PASSWORD') 
Các vấn đề liên quan