#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