добавил просмотр пользователей, обновил алгоритм работы авторизации

This commit is contained in:
VladislavOstapov 2024-01-12 20:33:00 +03:00
parent 7f4bdae4be
commit 09cfcdad0a
9 changed files with 135 additions and 16 deletions

View File

@ -3,7 +3,7 @@ import os
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
from django.shortcuts import render from django.shortcuts import render
# from django.db.models import Manager # from django.db.models import Manager
from django.contrib.auth import authenticate, login from django.contrib.auth.decorators import login_required
# только для тестирования! # только для тестирования!
import requests import requests
@ -11,11 +11,9 @@ import requests
TEST_BASE_FETCH = "https://test.wawaa.ru/dev-fetch.php" TEST_BASE_FETCH = "https://test.wawaa.ru/dev-fetch.php"
@login_required
def view_index(request): def view_index(request):
if request.user.is_authenticated:
return render(request, 'index.html') return render(request, 'index.html')
else:
return HttpResponseRedirect('/account/login')
def view_stats(request): def view_stats(request):

View File

@ -123,6 +123,8 @@ AUTH_PASSWORD_VALIDATORS = [
}, },
] ]
LOGIN_URL = "/account/login"
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/5.0/topics/i18n/ # https://docs.djangoproject.com/en/5.0/topics/i18n/

View File

@ -61,3 +61,10 @@ header * {
color: var(--brand-text); color: var(--brand-text);
} }
.value-good {
color: var(--text-good);
}
.value-bad {
color: var(--text-bad);
}

View File

@ -0,0 +1,59 @@
{% extends 'base.html' %}
{% load static %}
{% block styles %}
<style>
.table-wrapper {
overflow-x: auto;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
table, th, td {
padding: 5px;
border: 2px solid var(--bg-selected);
}
thead {
background: var(--brand-bg);
}
</style>
{% endblock %}
{% block header %}
<h1> Просмотр аккаунтов </h1>
{% endblock %}
{% block content %}
{% if user.is_superuser %}
<div class="table-wrapper">
<table>
<thead>
<tr>
<td>Логин</td>
<td>Админ</td>
<td>Последний вход</td>
<td>Последнее обновление пароля</td>
<td>Зарегистрирован</td>
</tr>
</thead>
<tbody>
{% for u in users %}
<tr>
<td>{{ u.login }}</td>
<td>{{ u.is_superuser }}</td>
<td>{{ u.last_login }}</td>
<td>{{ u.last_password_change }}</td>
<td>{{ u.registered }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<h2>Недостаточно прав для просмотра страницы</h2>
<p>Для просмотра списка пользователей необходимо иметь статус администратора.</p>
{% endif %}
{% endblock %}

View File

@ -62,11 +62,11 @@
{% block content %} {% block content %}
<div id="form-wrapper"> <div id="form-wrapper">
<h1> Войти </h1> <h1> Войти </h1>
<form action="{% url 'login' %}" method="POST" id="login-form"> <form method="POST" id="login-form">
{% csrf_token %} {% csrf_token %}
{% if message %} {% if message %}
<div class="form-row error-message"> <div class="form-row value-bad">
{{ message }} {{ message }}
</div> </div>
{% endif %} {% endif %}

View File

@ -0,0 +1,37 @@
{% extends 'base.html' %}
{% load static %}
{% block styles %}
<style>
.table-wrapper {
overflow-x: auto;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
table, th, td {
padding: 5px;
border: 2px solid var(--bg-selected);
}
thead {
background: var(--brand-bg);
}
</style>
{% endblock %}
{% block header %}
<h1> Аккаунт {{ view_user.login }} </h1>
{% endblock %}
{% block content %}
{% if have_permissions %}
{% else %}
<h2>Недостаточно прав для просмотра страницы</h2>
<p>Для просмотра списка пользователей необходимо иметь статус администратора.</p>
{% endif %}
{% endblock %}

View File

@ -24,14 +24,6 @@
#canvas-wrapper { #canvas-wrapper {
max-width: 1000px; max-width: 1000px;
} }
.value-good {
color: var(--text-good);
}
.value-bad {
color: var(--text-bad);
}
</style> </style>
{% endblock %} {% endblock %}

View File

@ -22,5 +22,6 @@ urlpatterns = [
path('register', views.default_view, name='register'), path('register', views.default_view, name='register'),
path('login', views.view_login, name='login'), path('login', views.view_login, name='login'),
path('logout', views.view_logout, name='logout'), path('logout', views.view_logout, name='logout'),
path('list', views.view_list, name='accounts-list'),
path('change-password', views.default_view, name='change-password'), path('change-password', views.default_view, name='change-password'),
] ]

View File

@ -4,6 +4,8 @@ from django.http import HttpResponse, HttpResponseRedirect, HttpResponseBadReque
from django.shortcuts import render from django.shortcuts import render
# from django.db.models import Manager # from django.db.models import Manager
from django.contrib.auth import authenticate, login, logout from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from .models import User
def default_view(request): def default_view(request):
@ -17,6 +19,15 @@ def view_logout(request):
def view_login(request): def view_login(request):
if request.user.is_authenticated:
# уже авторизован, перенаправляем либо в корень, либо по пути, указанному в next
redirect_uri = "/"
if "next" in request.GET:
if request.GET['next'] != request.path:
# чтобы не возникло циклического редиректа
redirect_uri = request.GET['next']
return HttpResponseRedirect(redirect_uri)
render_context = { render_context = {
'message': None 'message': None
} }
@ -26,7 +37,12 @@ def view_login(request):
user = authenticate(request, username=username, password=password) user = authenticate(request, username=username, password=password)
if user is not None: if user is not None:
login(request, user) login(request, user)
return HttpResponseRedirect('/') redirect_uri = "/"
if "next" in request.GET:
if request.GET['next'] != request.path:
# чтобы не возникло циклического редиректа
redirect_uri = request.GET['next']
return HttpResponseRedirect(redirect_uri)
else: else:
render_context['message'] = "Неверный логин или пароль" render_context['message'] = "Неверный логин или пароль"
return render(request, 'account/login.html', render_context) return render(request, 'account/login.html', render_context)
@ -36,4 +52,11 @@ def view_login(request):
return HttpResponseBadRequest() return HttpResponseBadRequest()
@login_required
def view_list(request):
users = []
# ограничение права на просмотр списка пользователей для непривилегированных пользователей
if request.user.is_superuser:
users = User.objects.order_by('login')
return render(request, 'account/list.html', {'users': users})