2016-06-30 7 views
1

Переход от проверки, управляемой контейнером, к плагину Spring Security в приложении Grails 3.1.9. В мире, управляемом контейнером, наши перехватчики Grails выполняются ПОСЛЕ аутентификации для защищенного ресурса. Тем не менее, с Spring Security, перехватчики (с ранее() логикой) выполнять в следующей последовательности:Могут ли перехватчики выполняться между аутентификацией и выполнением действия?

  1. вызовы к защищенному ресурсу
  2. запроса
  3. перехватчик стек перехватывает, возвращает истину
  4. перенаправлен для формирования страницы входа
  5. Успешная аутентификация
  6. Перенаправление запрашиваемый ресурс

Мы перехватчики, что Shoul d только для пользователей, прошедших проверку подлинности. Есть ли способ, чтобы вместо этого потока выполнялись перехватчики между шагом 4 & 5? Или это, где наша логика перехватчика должна переместиться в фильтры Spring Security?

+0

У меня есть те же требования, что и этот вопрос, но я не мог выполнить ответ. Я написал перехватчик, который отлично работает при запуске из intellij или grails run-app, но когда я разворачиваю его в tomcat в качестве файла войны, все адские разрывы теряются. Мой токен получает аутентификацию, но я получаю springSecurityService.principal = null. Подробности в этом вопросе. –

ответ

2

Это немного более понятно, если вы посмотрите на поток в приложении 2.x, так как есть файл web.xml, где более понятно, в каком порядке выполняется несколько частей, но в основном это то же самое в 2.x и 3.x.

Цепь фильтра плагина зарегистрирована как один фильтр и сконфигурирована для запуска после фильтра grailsWebRequest, но до GrailsDispatcherServlet. Это поддержка аннотированных контроллеров, которые могут иметь сопоставления URL-адресов, отличные от значений по умолчанию (например, PersonController.show() может отображаться в /person/show, но приложение могло бы сопоставить его с любым действительным uri (и комбинацией глаголов REST), поэтому мне нужно иметь возможность искать экземпляры сопоставленного URL-адреса, чтобы выяснить, какие действия контроллера будут выполняться для текущего запроса. В фильтре я знаю, какой URL-адрес запрашивается, но не применимо к правилам безопасности, если все было основано на URL-адресах это было бы просто и предварительно скомпилировано при запуске, но с аннотированными контроллерами я знаю только, какие правила применяются к методам контроллера.

Сервлет запускается после фильтров, и именно здесь определяется и вызывается контроллер. Перехватчики (и фильтры Grails (не путать с фильтрами сервлетов) в 2.x) на самом деле являются Spring HandlerInterceptors, которые получают com позиционируется вместе с «обработчиком» в HandlerExecutionChain. Это достаточно общее для работы с любым типом запроса, но на практике обработчик является контроллером, поэтому область действия намного уже, чем если бы это был фильтр сервлетов.

Итак, чтобы вернуться к вашему актуальному вопросу, ваш лучший вариант - сделать работу в фильтре, который добавлен в цепочку фильтров Spring Security. Они довольно просты в реализации, и процесс описан в plugin docs.

+0

У меня есть те же требования, что и у этого вопроса, но я не мог выполнить ответ. Я написал перехватчик, который отлично работает при запуске из 'intellij' или' grails run-app', но когда я развертываю его в tomcat в качестве военного файла, все адские прорывы теряются. Мой токен получает аутентификацию, но я получаю 'springSecurityService.principal = null'. Подробности находятся в этом вопросе (https://stackoverflow.com/questions/43999961/springsecurityservice-principal-returns-null-when-deployed-as-a-war-in-tomcat-8). –