Это не было проблемой в Grails 2 и теперь появляется только в Grails 3. Любой контроллер, который вызывает асинхронную задачу, не может получить доступ к SecurityContextHolder, чтобы получить вошедшей в систему во время визуализации представления ....В Grails 3.2.6 действия контроллера Async теряют доступ к SecurityContextHolder
Похоже, что в SecurityContextPersistenceFilter вызывается SecurityContextHolder.clearContext() до того, как DispatcherServlet.processDispatchResult сможет визуализировать, что делает код рендеринга недоступным для входа в систему информация о пользователе, хранящаяся в SecurityContextHolder:
try {
SecurityContextHolder.setContext(contextBeforeChainExecution);
chain.doFilter(holder.getRequest(), holder.getResponse());
}
finally {
SecurityContext contextAfterChainExecution = SecurityContextHolder
.getContext();
// Crucial removal of SecurityContextHolder contents - do this before anything
// else.
SecurityContextHolder.clearContext();
repo.saveContext(contextAfterChainExecution, holder.getRequest(),
holder.getResponse());
request.removeAttribute(FILTER_APPLIED);
if (debug) {
logger.debug("SecurityContextHolder now cleared, as request processing completed");
}
}
При f Сначала я думал, что проблема связана с тем, что контекст безопасности не передается в исполняемый файл Promise (или что-то подобное) и устанавливает springsecurity.sch.strategyName = "MODE_INHERITABLETHREADLOCAL" безрезультатно.
Вот несколько скриншотов показывает отладчик:
1) Эта линия в DispatcherServlet еще не выполнена. Смотрите заявление в нижней части изображение показывает .getAuthentication = NULL возвращает истинное
2) Перед тем как SecurityContextHolder очищаются в SecurityContextPersistenceFilter:
3) После возвращения из ha.handle, .getAuthentication() теперь нулевой
4) getAuthentication() теперь нуль перед визуализацией вид/результат
Чтобы уточнить, я пытаюсь получить доступ к springSecurityService.currentUser из библиотеки пользовательских тегов, которая отображает заголовок моей страницы в макете.
Таким образом, в типе layout.gsp файла:
<header id="header" class="md-whiteframe-1dp">
<g:renderHeader/></header>
с определением renderHeader как:
def renderHeader = { attrs, body ->
SecUser currentUser = (SecUser) accountService.activeUser
log.info("About to render header, session.id=" + session.id +
(currentUser?.userLogLabel ?: " user=not_logged_in"))
out << render(template: "/header", model: [currentUser : currentUser])
}
Я начинаю чувствовать, что у него есть что-то делать, когда SiteMesh выполняет и асинхронный участвуют, что SiteMesh потерял ручку на SecurityContextHolder .... –