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