Spring FilterChain + Security: входить запрос пользователя или нет - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть REST-сервис Spring web-mvc с несколькими инициализаторами.

WebAppInitializer.java

@Order(1)
public class MyFiltersInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) {
        FilterRegistration.Dynamic registration = servletContext.addFilter("myRequestFilter", DelegatingFilterProxy.class);
        // register other filters and DispatcherServlet
    }
}

SecurityWebAppInitializer.java

@Order(2)
public class MySecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected Set<SessionTrackingMode> getSessionTrackingModes() {
        return EnumSet.of(SessionTrackingMode.COOKIE, SessionTrackingMode.URL);
    }
}

Как вы можетесм. SecurityFilterChain добавляется после всех пользовательских фильтров запросов.Мне нужно регистрировать каждый запрос и включать User для регистрации, если запрос авторизован

Что-то вроде MyRequestFilter.java:

@Slf4j
public class RequestFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(final HttpServletRequest request,
                                    final HttpServletResponse response,
                                    final FilterChain filterChain) throws ServletException, IOException {
           MyUser user = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); //no auth yet
           log.debug("request {} start, user {}", request, user); 
           filterChain.doFilter(request, response); //may return 401 or 403, what also need to be logged
           log.debug("request {} end with response {}", request, response);
   }

Есть идея добавить LogBodyHolder, который сохраняет тело журнала до тех пор, пока SecurityChain не будет пройден полностью, а затем вызвать log.debug.Но есть ли симпатичный способ решить эту проблему?

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете просто создать Spring Bean, который расширяет класс AbstractRequestLoggingFilter, предоставляемый Spring, а затем переопределить методы beforeRequest() и afterRequest(), чтобы добавить свои журналы по своему желанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...