Jak umożliwić użytkownikom zmianę własnych haseł w Django?


84

Czy ktoś może wskazać mi kod, w którym użytkownicy mogą zmieniać swoje własne hasła w Django?


17
Jeśli Google zmusił nas do szukania odpowiedzi zamiast o nich myśleć, stackoverflow sprawia, że ​​pytamy o odpowiedzi, a nie nawet ich szukamy.
sykora

2
-1 dla „plzsendmetehcodes”. Przy okazji, powinieneś przyjąć poprawną odpowiedź na swoje pytania.
Cat Plus Plus

8
Tak, często korzystałem z Google i nadal to robię. Ale SO jest łatwiejsze i szybsze, a Ty możesz angażować się w dyskusje i słuchać alternatywnych odpowiedzi. Dopóki są ludzie tacy jak Svetlozer Angelov i inni, którzy są gotowi poświęcić swój czas (i zdobyć punkty) na odpowiedzi na proste pytania, cóż, po to jest SO.
DOK

7
Django ma tak obszerną i łatwo dostępną dokumentację, że ciągłe próby odtworzenia całej dokumentacji w odpowiedziach SO nie mogą w żaden sposób dodać wartości.
Ben James

3
@Ben James: taka dobra uwaga. Właściwie to właśnie dlatego zamiast przepisać dokumentację w moich odpowiedziach, po prostu podaję podstawowe informacje i link do dokumentów.
cethegeek

Odpowiedzi:


161

Django zawiera system uwierzytelniania użytkowników. Obsługuje konta użytkowników, grupy, uprawnienia i sesje użytkowników oparte na plikach cookie. Ten dokument wyjaśnia, jak to działa.

Jak zmienić hasła w Django

Zobacz sekcję Zmiana haseł

  1. Nawigacja do projektu, w którym manage.pyznajduje się plik

  2. $ python manage.py shell

  3. wpisz poniżej skrypty:

z django.contrib.auth.models import User
u = User.objects.get (nazwa_użytkownika__exact = 'jan')
u.set_password ('nowe hasło')
u.save ()

Możesz także użyć prostego manage.pypolecenia:

manage.py changepassword *username*

Wystarczy dwukrotnie wprowadzić nowe hasło.

z sekcji Zmiana haseł w dokumentacji.


Jeśli masz django.contrib.adminw swoim INSTALLED_APPS, możesz odwiedzić stronę: example.com/path-to-admin/password_change/która będzie miała formularz do potwierdzenia starego hasła i dwukrotnego wprowadzenia nowego hasła.


15
Nie sądzę, żeby to pomagało tworzyć strony, na których użytkownicy mogliby zmieniać swoje hasła - wystarczy, że zrobi to administrator.
Micah Walter

25

Możesz także po prostu użyć django.contrib.auth.views.password_changewidoku w swoim URLconf. Używa domyślnego formularza i szablonu; dostarczenie własnego jest opcjonalne.


4

Nie ma potrzeby przechodzenia do powłoki, wpisywania passwd i ponownego wprowadzania passwd

 python manage.py changepassword <username> 
  or
/manage.py changepassword <username>

Korzystanie z powłoki

python manage.py shell
from django.contrib.auth.models import User
users=User.objects.filter(email='<user_email>') 
  #you can user username or etc to get users query set
  #you can also use get method to get users
user=users[0]
user.set_password('__enter passwd__')
user.save()
exit()

3

Ten samouczek pokazuje, jak to zrobić z widokami opartymi na funkcjach:

Zobaczyć plik:

from django.contrib import messages
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.forms import PasswordChangeForm
from django.shortcuts import render, redirect

def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            user = form.save()
            update_session_auth_hash(request, user)  # Important!
            messages.success(request, 'Your password was successfully updated!')
            return redirect('change_password')
        else:
            messages.error(request, 'Please correct the error below.')
    else:
        form = PasswordChangeForm(request.user)
    return render(request, 'accounts/change_password.html', {
        'form': form
    })

Plik adresu URL:

from django.conf.urls import url
from myproject.accounts import views

urlpatterns = [
    url(r'^password/$', views.change_password, name='change_password'),
]

I na koniec szablon:

<form method="post">
  {% csrf_token %}
  {{ form }}
  <button type="submit">Save changes</button>
</form>


1

Po dodaniu wzorca adresu URL, jak pokazano w odpowiedzi Ciro Santilli, szybkim sposobem umożliwienia użytkownikom zmiany haseł jest przyznanie im „dostępu personelu” do funkcji administratora. Jeśli nie dodasz ich do żadnej grupy lub nie nadasz im specjalnych uprawnień, nadal będą mogli zmienić swoje hasło, przechodząc do strony example.com/admin. Dostęp dla personelu pozwala im przejść do strony, nawet jeśli jest pusta; w prawym górnym rogu mogą kliknąć „zmień hasło” i skorzystać z funkcji administratora.


1

To jest polecenie, którego użyłem, na wypadek gdybyś miał problem z tym rzutem AttributeError: Manager isn't available; 'auth.User' has been swapped for 'users.User'.

python manage.py shell -c "from django.contrib.auth import get_user_model; 
User = get_user_model(); 
u = User.objects.get(username='admin'); 
u.set_password('password123');
u.save()"

1

Zgodnie z dokumentacją użyj:

from django.contrib.auth.hashers import makepassword

Głównym powodem jest to, że Django używa zakodowanych haseł do przechowywania w bazie danych.

password=make_password(password,hasher='default')
obj=User.objects.filter(empid=emp_id).update(username=username,password=password)

Użyłem tej techniki do niestandardowego modelu użytkownika, który pochodzi z AbstractUsermodelu. Przepraszam, jeśli technicznie błędnie wpisałem klasę i podklasę, ale technika działała dobrze.


0

Bardzo podobny do odpowiedzi @ Ciro, ale bardziej szczegółowy do oryginalnego pytania (bez dodawania wszystkich widoków uwierzytelniania):

wystarczy dodać do urlpatternsw urls.py:

url('^change-password/$', auth_views.password_change, {'post_change_redirect': 'next_page'}, name='password_change'),

Zauważ, że post_change_redirectokreśla adres URL do przekierowania po zmianie hasła.

Następnie po prostu dodaj do szablonu:

<a href="{% url 'password_change' %}">Change Password</a>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.