Простой способ перенаправить определенные роли в 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)
Другие вопросы по тегам