Как запретить зарегистрированным пользователям получать доступ к страницам входа / регистрации с помощью 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'))