Приложение Django с аутентификацией пользователя на уровне проекта

#python #django #authentication

#python #django #аутентификация

Вопрос:

Как мне обрабатывать аутентификацию пользователя внутри приложения, когда аутентификация пользователей выполняется на уровне проекта?

Я создаю приложение, в котором мне нужен аутентифицированный пользовательский объект при создании записей базы данных, но я не хочу иметь дело со всей логикой регистрации / входа внутри приложения, которая должна быть удалена на уровне проекта. Вместо этого.

Для приложения требуется вход пользователя, но при разработке я не могу понять, куда это поместить. Могу ли я «подделать» аутентифицированного пользователя внутри settings.py для проекта?

Обновить

Я понял, что все, что мне нужно было сделать, это войти в / admin после добавления @login_required ко всем моим представлениям. Затем я получал нужные мне данные, используя request.user и добавляя модели.Внешний ключ (User) для моделей, которым это было необходимо

Комментарии:

1. вы хотите вручную авторизовать пользователя внутри приложения без необходимости писать код входа в это приложение views?

2. Я добавлю @login_required к своим представлениям, и мне нужно будет получить модель пользователя, но при разработке приложения достаточно, чтобы был фиктивный пользователь

3. Этого достаточно, и если вы хотите больше проверять пользователей, создайте пользовательский декоратор по мере необходимости

4. Вы можете создать декоратор, чтобы проверить, является ли этот администратор …. и т. д

Ответ №1:

По умолчанию нет способа подделать пользователя, но вы можете легко реализовать это самостоятельно.

Вы можете просто создать представление, которое регистрирует жестко запрограммированного пользователя.

 def force_login(request):
    # this check is not really required, but probably a good idea
    if not settings.DEBUG:
        raise ImproperlyConfigured("Don't use the force_login view in production")
    user, created = User.objects.get_or_create(
        username='user',
        defaults={...})  # set whatever defaults you need
    user.backend = settings.AUTHENTICATION_BACKENDS[0]
    login(request, user)
    return HttpResponse('logged in')
  

Теперь вам просто нужно добавить это представление в свой urls.py . Альтернативным подходом было бы написать это как промежуточное программное обеспечение.

 class ForceAuthenticationMiddleware(object):
    """
    Ensures that the request has a logged in user.

    If there is no user, it logs in a default user and return a
    redirect.
    """

    def process_request(self, request):
        if request.user.is_authenticated:
            return
        user, created = User.objects.get_or_create(
            username='user',
            defaults={...})  # set whatever defaults you need
        user.backend = settings.AUTHENTICATION_BACKENDS[0]
        login(request, user)
        return HttpResponseRedirect(request.get_full_path())
  

Вставьте это промежуточное программное обеспечение в свой settings.MIDDLEWARE_CLASSES после 'django.contrib.auth.middleware.AuthenticationMiddleware',

Обновление: я превратил этот ответ в сообщение в блоге и опубликовал промежуточное программное обеспечение на PyPI.

Комментарии:

1. Не совсем. Я добавлю @login_required к своим представлениям, я просто не хочу создавать часть, которая обрабатывает создание учетной записи и вход пользователя в систему, чтобы создать приложение. Мое приложение будет добавлено в приложение, в котором пользователи должны входить в систему, эта логика обрабатывается проектом, а не моим приложением

2. @kristiannissen да, используйте только обязательный логин и указывайте только URL для входа

3. @kristiannissen Я переписал свой ответ, надеюсь, на этот раз правильно понял ваш вопрос 🙂

Ответ №2:

Согласно документации по системе аутентификации Django

если вы ищете способ ограничить доступ для зарегистрированных пользователей, используйте login_required() decorator:

 from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):
        #your code
  

По умолчанию путь, на который пользователь должен быть перенаправлен после успешной аутентификации, сохраняется в параметре строки запроса с именем «next», который my_view в этом примере является конечным после входа пользователя в систему. Пользовательский объект подключен к request