Пирамида: перезаписать правила маршрутизации на основе статуса пользователя - PullRequest
0 голосов
/ 31 марта 2020

Я работаю над небольшим веб-приложением Pyramid (Python). Одним из требований является то, что пользователь сбрасывает пароль через определенный промежуток времени, скажем, один раз в год. (Я не считаю, что это требование должно помочь с точки зрения безопасности, однако внутренняя политика клиента требует этого.)

Обновление пароля должно выполняться после успешного входа в систему. Легко добавить logi c для отображения диалогового окна обновления пароля после входа в систему, но также возможно, что пользователь просто уходит, используя URL-адрес в закладках или тому подобное.

Что мне потребуется do перезаписывает правила маршрутизации на основе свойства вошедшего в систему пользователя. Однако конфигурация маршрутизации выглядит как набор правил c в Pyramid.

Есть ли способ перезаписать правила маршрутизации на основе состояния пользователя, чтобы все запросы к другим представлениям переадресовывались / перенаправлен в диалог обновления пароля?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Предполагая, что у вас есть представления на основе классов, и что вы установили переменную сеанса is_password_recent, которая равна True, если менее одного года go, вы можете поместить следующее в __init__() каждого класса:

class UserViews:
    def __init__(self, request):
        self.request = request

        if not request.session["is_password_recent"]:
            raise HTTPFound(
                location=request.route_url(
                    "password_renew", _query={"return": request.path}
                )
            )

Возможно, вы тоже DRY могли бы это сделать, поместив логический c в метод в модуле utils и импортировав его.

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

Я нашел решение, используя События Пирамиды :

from pyramid.events import NewRequest, subscriber

@subscriber(NewRequest)
def intercept(event):
    # use event.request to check if an interception/redirect is required
    raise HTTPFound(location='route_to_form')

Важно тщательно проверить входящий запрос. Например, пути, включающие маршрут, используемый далее в процессе, должны быть исключены, в противном случае приложение заканчивается в бесконечном l oop.

...