Пользовательский вход в админку 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

это не сработает. У меня есть идея использовать промежуточное ПО, но тогда оно будет проверять каждый запрос, а это не то, что я хочу (я хочу только для логинов)

Вернуться на верх