Как запретить зарегистрированным пользователям получать доступ к страницам входа / регистрации с помощью Flask-Stormpath?

Я создаю приложение Flask, которое использует Stormpath и Flask-Stormpath для аутентификации. Я хочу запретить вошедшему в систему пользователю доступ к страницам /login или /register (поскольку это не имеет особого смысла - вошедшему в систему пользователю не нужно входить в систему, и вы зарегистрированы по определению, если вы уже вошли в систему). Я попытался найти решение в своем пользовательском шаблоне страницы входа, делая что-то вроде:

{% block page_heading %}

    {% if user.given_name %}
        Already Logged in as {{ user.given_name }}
    {% else %}
        Enter your credentials
    {% endif %}

{% endblock page_subheading %}

Если пользователь в данный момент вошел в систему, будет определено имя user.given_name, а блок page_heading примет сообщение "уже вошел в систему", а в противном случае - сообщение "введите свои учетные данные" (в обычном случае неаутентифицированный пользователь пытается войти в систему). в). Я использую ту же конструкцию, чтобы показать форму входа или текст ошибки. Однако эта попытка не работает: как будто user.given_name всегда возвращается к неопределенному, когда зарегистрированный пользователь посещает / входит в систему. Это подразумевает, что если кто-то вошел в систему, а затем посетил / вошел в систему, то он вышел из системы - это объяснило бы неудачу моей попытки найти решение.

Учитывая вышеизложенное и после просмотра документации, я мог бы использовать is_authenticated(); однако не через Flask-Stormpath, а через базовый модуль Flask-Login, поскольку Flask-Stormpath всегда устанавливает для этого значение true, согласно документам, но я понятия не имею, как это сделать.

Кроме того, мой подход хакерский - я считаю, что лучшее решение будет находиться на стороне приложения в Python.

Итак, мой вопрос заключается в следующем: Как наиболее разумно обнаружить пользователей, вошедших в систему и с учетом этого запретить им доступ к страницам /login и /register или перенаправить их? Возможно, где-то есть магический декоратор, противоположный

@login_required 

или встроенную "несанкционированную" группу Stormpath, которую я мог бы использовать, как в

@groups_required(['unauthorised'])

Или, может быть, я был на правильном пути с моей первоначальной попыткой.

Любая помощь приветствуется:)

2 ответа

Heyo!

Итак, я автор Flask-Stormpath, я думал, что прыгну сюда. Вместо того, чтобы пытаться изменить поведение входа в систему / регистрации (что я бы не рекомендовал, так как мы периодически меняем это с выпусками библиотеки), лучшим решением будет просто скрыть эти URL-адреса от пользователя после его входа в систему.

Например, на многих веб-сайтах есть верхняя панель навигации, в которой изначально написано "Войти" и "Зарегистрироваться". Но, как только вы вошли в систему, эти кнопки меняются на что-то другое, обычно "Панель инструментов" или подобное.

Таким образом, пользователь не сможет перейти в /login или / register, если он не введет данные в браузер и не попытается перейти туда вручную.

Я думаю, что это идеальный сценарий, который вы можете выполнить, используя шаблон условной логики:

{% if user %}
...
{% else %}
...
{% endif %}

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

if current_user.is_authencticated():
    return redirect (url_for('home'))
Другие вопросы по тегам