Пользовательский вход в админку Django с помощью пакета django allauth
Мне нужен функционал, в котором при входе пользователя на страницу администратора, либо используя имя пользователя и пароль, либо используя google sso (используя пакет allauth). они все равно должны пройти определенную проверку.
Теперь у меня есть виды, где я указываю свои проверки:
views.py
def custom_login(request):
if request.method == 'POST':
form = AuthenticationForm(request, request.POST)
if form.is_valid():
user = form.get_user()
# Check if the user belongs to a specific group
print(user)
check_in_wd = check_user_in_wd(user)
if (user.groups.exists() or user.is_staff) and check_in_wd:
login(request, user)
return redirect('/admin/') # Redirect to admin dashboard after successful login
else:
messages.error(request, 'You are not authorized to access the admin page.')
else:
messages.error(request, 'Invalid username or password')
else:
form = AuthenticationForm()
return render(request, 'admin/login.html', {'form': form})
urls.py
urlpatterns = [
path('grappelli/', include('grappelli.urls')), # grappelli URLS
path('admin/login/', custom_login, name='custom_login'),
path('admin/', admin.site.urls),
path('accounts/', include('allauth.urls')),
]
login.html - только для дополнительных ссылок
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>App</title>
</head>
<body>
{% extends "admin/login.html" %}
{% load static %}
{% load i18n %}
{% block content %}
<div id="content-main">
<form id="login-form" method="post" action="{% url 'admin:login' %}" novalidate>
{% csrf_token %}
{{ form.non_field_errors }}
<div class="form-row">
<label for="id_username">{{ _('Username') }}:</label>
{{ form.username }}
</div>
<div class="form-row">
<label for="id_password">{{ _('Password') }}:</label>
{{ form.password }}
</div>
<div class="form-row">
<input type="submit" value="{% trans 'Log in' %}">
</div>
<div class="form-row">
<a href="/accounts/google/login/?process=login" class="socialaccount_login provider_google">
<img src="https://developers.google.com/static/identity/images/branding_guideline_sample_nt_sq_lg.svg" alt="{% trans 'Sign in with Google' %}">
</a>
</div>
</form>
</div>
{% endblock %}
</body>
</html>
К сожалению, custom_login работает, только если пользователь входит в систему, используя имя пользователя и пароль, но не работает для google sso логинов, как мне это исправить?
ive Попробовал использовать декораторы на 'admin/', но все равно не работает, потому что 'admin.site.urls' возвращает tuple.
urlpatterns = [
path('grappelli/', include('grappelli.urls')), # grappelli URLS
path('admin/', custom_login(admin.site.urls)),
path('accounts/', include('allauth.urls')),
]
def custom_login(view_func):
def wrapper(request, *args, **kwargs):
...same codes...
return view_func(request, *args, **kwargs)
return wrapper
это не сработает. У меня есть идея использовать промежуточное ПО, но тогда оно будет проверять каждый запрос, а это не то, что я хочу (я хочу только для логинов)