Простой способ перенаправить определенные роли в zope
У меня есть раздел моего сайта zope 2, в котором используется промежуточный макрос между содержимым и макросом всего сайта. Я не хочу применять защиту к папке, но мне хотелось бы, чтобы временный макрос перенаправлял пользователей на экран входа в систему, если они пытаются загрузить страницу, которая его использует.
Примером этого может быть следующее:
page_html содержит содержимое, он использует макрос в special_template, который затем вставляется в макрос в standard_template. Поэтому я хочу, чтобы он перенаправил на экран входа в систему. Если page_html не использует special_template, а сразу переходит к standard_template (что и делают большинство страниц сайта), я бы не хотел, чтобы он перенаправлял.
Как я мог этого добиться?
1 ответ
Прежде всего, почему бы не реструктурировать свой сайт, чтобы разместить все эти страницы, требующие аутентификации, в местах, которые вы можете защитить с помощью разрешений Zope? Пользовательский (локальный) рабочий процесс может применять разрешения в зависимости от состояния и местоположения, используя при этом собственную систему автоматической аутентификации Zope. Если вы не используете рабочий процесс, пользовательский тип может по-прежнему применять разрешения, полученные любым объектом ниже в пространстве URL.
Вы можете создать метод (представление Zope3, скрипт Python в слое обложки, метод класса содержимого в контексте получения, внешний метод в грубом порядке лучших практик), который вызывается из макроса special_template с помощью таль: определение заявления. Я назначу вывод фиктивной переменной здесь, потому что вас это не волнует, мы будем использовать его для побочных эффектов. В следующем примере предполагается, что вы выбрали способ просмотра Z3:
<body tal:define="dummy context/@@redirect_if_anonymous">
Это создаст представление, зарегистрированное с именем redirect_if_anonymous
, В представлении вы можете затем проверить, прошел ли ваш веб-посетитель проверку подлинности, используя стандартные методы Zope API или тест на cookie, в зависимости от вашего приложения. Вот стандартный пример API, он вызовет Unauthorized для принудительного входа в систему.
from Products.Five import BrowserView
from AccessControl import getSecurityManager, Unauthorized
from AccessControl.SpecialUsers import nobody
class RedirectAnonymous(BrowserView):
def __call__(self):
sm = getSecurityManager()
user = sm.getUser()
if user is None or user is nobody:
raise Unauthorized
Если все, что вам нужно, это перенаправление в другое место, просто используйте response.redirect():
url = self.request['URL0'] + '/login.html'
self.request.response.redirect(url)
Если вы хотите сначала проверить файлы cookie, они являются частью переменных запроса:
if 'mycookie' not in self.request.cookies:
self.request.response.redirect(url)