В Django как установить значение в объекте запроса в функции оформителя и получить к нему доступ из объекта запроса в оформленной функции - PullRequest
0 голосов
/ 13 марта 2020

Я реализовал API бэкэнда, используя django. Подробности среды: as-

Среда: платформа: Linux (ubuntu) Framework: Django 1.11.28 Язык программирования: python 2.7.12 (в будущем планируется перенести 3.8) База данных: Mongodb 3.4

Описание: я разработал веб-сервисы, используя django. Это обычные веб-сервисы, а не Restful (ранее не было полной поддержки mongodb для Django rest framework), поэтому большинство вещей настроено не в соответствии со django стандартом.

Сведения о проблеме: Для аутентификации Я использую Azure AD. Я написал простой декоратор, который получает токен доступа из запроса, отправленного фронтальным веб-приложением / мобильным устройством, затем этот декоратор проверяет токен и возвращается к просмотру. Для аутентификации я использую пакет django -auth-adfs

декоратор

authorisation.py

def is_authorized(function):
    @wraps(function)
    def authorize(request, *args, **kwargs):
        # access token validation logic
        if validated(token):
            # get user details from access token first_name, last_name etc
            user_info = {"first_name":"foo","last_name":"bar"}
            return function(request, *args, **kwargs)
        else:
            return HttpResponse('Unauthorized', status=401)
return authorize

View.py

@is_authorized
def home_view(request):
    # calling function which decodes access token and return user details.
    # This function contains same code as in decorator except function it returns user_info
    **first_name, last_name = get_userinfo_from_access_token(request)**
return JsonResponse({"data":{"fname":first_name,"lname":last_name}})

Как видите, код получился грязным и повторяющимся. Здесь я не могу получить доступ к пользовательским данным, которые уже расшифрованы. Чтобы получить информацию о пользователе, я написал тот же код в функции get_userinfo_from_access_token (), передав объект запроса, я не думаю, что это не близко к «ok».

  • Мне нужен подход, который соответствует стандарту django и сопровождается большинством django разработчиков. Требуется ли мне реализовать какой-либо аутентификационный бэкэнд или некоторое промежуточное ПО django, если да, пожалуйста, проведите меня через него.

Учитывая мой текущий сценарий и среду,

  1. Можете ли вы объяснить лучший и стандартный подход для доступа к пользовательским данным из объекта запроса
  2. Мною создано множество представлений, я добавляю декоратор is_authorized к каждому представлению. Существует ли какой-либо стандартный и лучший подход для защиты представления.
  3. Я планирую переписать весь код в будущем, используя django rest framework. Я буду очень благодарен, если кто-нибудь предоставит мне какую-либо справку или руководство по созданию спокойных веб-сервисов, чтобы я мог использовать свой существующий код и сократить свои усилия.

Пожалуйста, дайте мне знать, если мне что-то неясно и требуется больше деталей. Заранее спасибо.

1 Ответ

0 голосов
/ 16 марта 2020

Хорошо. Позвольте мне дать ваш ответ последовательно.

  1. Напишите промежуточное программное обеспечение и прикрепите пользователя на основе токена из запроса к базе данных.
  2. Создайте другое промежуточное программное обеспечение, которое разрешит защищенный путь, только если Аутентификация пользователя осуществляется выше (1) промежуточным программным обеспечением.
  3. Поскольку django меняется день ото дня, будет лучше, если вы зададите отдельный вопрос, когда будете внедрять в REST. Я знаю стандарт, но ответ на него сейчас может устареть позже.

Теперь вернемся к средним товарам. Промежуточная посуда работает на заказ. Неправильный порядок тех, кто может не работать

1-ое промежуточное ПО

class UserResolverMiddleware(MiddlewareMixin):
    """
    A middleware class that adds a ``user`` attribute to the current request.
    """

    def process_request(self, request):
        """

        get token from request header
        validate token
        decode the token
        query on db or attach a fake user with necessary decoded data. 
        attach user object to request like request.user = user
        """

2-е.

from django.http import HttpResponseForbidden
class ProtectedViewMiddleware(MiddlewareMixin):


    def process_request(self, request):

        """
        create a list of URL which is not protected (e.g: login, forget password)
        unprotected_list = ['']
        if request url does not belongs to unprotected_list and request has no attribue user:

            return  HttpResponseForbidden()
        return 
        """
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...