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?

Ponton
źródło
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.

Svetlozar Angelov
źródło
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.

Ben James
źródło
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()
Panie Singh
źródło
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>
mniam
źródło
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.

ds58
źródło
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()"
ji-ruh
źródło
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.

user13682212
źródło
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>
Pablo Guerrero
źródło