Grails gsp: есть ли способ прервать рендеринг страницы gsp?

Есть ли способ со страницы gsp (или библиотеки типов) прервать создание html-страницы и обратиться к методу контроллера для вывода заголовка 403?

У нас есть набор структурных страниц, которые мы используем для наших административных страниц, и мы изменили их, чтобы проверить, есть ли у пользователя, обращающегося к этой странице, права администратора. В противном случае мы генерируем html-страницу с указанием «не сообщение администратора» (вместо обычного кода шаблона для страницы, то есть edit.gsp). Проблема здесь в том, что HTTP-ответ - это 200, и я действительно хочу, чтобы код состояния ответа был 403.

Контроллер, связанный с объектом домена, пуст, за исключением включения шаблонов, и мы сгенерировали страницы шаблонов (с помощью команды grails generate-view), мы также изменили эти страницы, чтобы проверить, является ли пользователь администратором.

Итак, мой вопрос сводится к тому, что один раз на странице gsp мы можем прервать работу и вызвать другой контроллер для генерации заголовка ошибки 403? Есть ли способ сделать это на странице gsp или нам нужно будет определить методы контроллера, соответствующие имени страницы просмотра, и в методе контроллера проверить, является ли пользователь администратором, а затем выдать ошибку 403?

Предпочел бы способ прервать создание текущей страницы gsp и иметь возможность вызывать другой контроллер для генерации заголовка 403.


person Peter Hiross    schedule 18.04.2018    source источник
comment
Почему бы не протестировать действие контроллера вместо рендеринга gsp? Тогда вы могли бы справиться с ситуацией намного лучше.   -  person Daniel    schedule 19.04.2018
comment
Я согласен, код, который я унаследовал, имеет контроллер для объекта домена, НО нет никаких методов. Контроллер просто имеет набор шаблонов для имени класса домена и набора сгенерированных представлений CRUD. Я не знал, можно ли добавить и обновить метод в контроллере (например) и заставить его отображать представление обновления. Это потребует много работы с нашей стороны (у нас более 100 объектов домена). Надеялся, что директива gsp или способ, которым можно было бы сделать через вызов библиотеки типов.   -  person Peter Hiross    schedule 19.04.2018
comment
В зависимости от вашей версии grails вы можете создать закрытие или класс beforeInterceptor (закрытие для 3.0.9 и ранее, я думаю, класс для последующего использования), который будет запускаться перед каждым действием, которому он соответствует. Если вы сообщите нам, какую версию Grails вы используете, я уверен, что я или кто-то другой смогу показать вам, как это сделать.   -  person Daniel    schedule 19.04.2018
comment
Спасибо. Мы используем grails 2.4.0 (я знаю, что хотелось бы обновить).   -  person Peter Hiross    schedule 19.04.2018


Ответы (1)


Я считаю, что вам лучше всего будет использовать перехватчик или фильтр. Я собирался привести пример, но здесь уже есть действительно хорошие: https://grails.github.io/grails2-doc/2.4.4/guide/theWebLayer.html#interceptors и https://grails.github.io/grails2-doc/2.4.4/guide/single.html#filters

По сути, любой из них - это код, который будет выполняться до (или после, но в вашем случае: до) выполнения действия контроллера. У вас есть доступ к параметрам, сеансу и т. Д., Поэтому вы можете выполнять такую ​​логику, как «является ли этот человек администратором». Вы также можете изменить ответ, чтобы вы могли перенаправить на страницу с отказом в разрешении или установить статус 403 или что-то еще, что вам нужно сделать.

person Daniel    schedule 19.04.2018
comment
Спасибо ... Я думаю, у нас будет несколько контроллеров, к которым это будет применено, и поэтому фильтр будет лучшим подходом. Нам также придется кодировать некоторые фильтры «после» для генерации некоторого дополнительного содержимого заголовка ответа. так что я считаю, что это будет правильный подход. - person Peter Hiross; 19.04.2018
comment
К вашему сведению, когда вы обновляетесь, или для кого-либо еще в этой ситуации: в Grails 3 то же самое можно сделать с помощью перехватчиков: docs.grails.org/3.3.4/guide/theWebLayer.html#interceptors - person Daniel; 19.04.2018
comment
Дэниел, просто дополнительный вопрос. Я смог легко создать фильтр и смог добавить дополнительные заголовки (еще одна проблема, которая у нас была). По объекту фильтра я вижу, что у меня есть доступ к запросу, ответу, параметрам, флэш-памяти и нескольким другим объектам. Меня беспокоит то, что когда GSP-страница обнаружила несанкционированный доступ к странице, как GSP может пометить эту страницу, чтобы фильтр мог быстро обнаружить эту страницу и изменить код состояния на 403. Страница GSP визуализировала эту страницу с помощью код состояния 200, и мы используем фильтр (после), чтобы изменить код состояния на «403». Спасибо - person Peter Hiross; 01.05.2018