Spring безопасный фильтр для защиты анонимных запросов

#java #spring #rest #security #spring-mvc

#java #spring #отдых #Безопасность #spring-mvc

Вопрос:

Еще один вопрос о конфигурации spring…

У меня есть несколько методов rest, открытых для всех и не защищенных. Эти методы rest на сервере № 1 используются другим сервером № 2 в том же домене для получения некоторых данных. Идея заключается в том, что сервер № 2 устанавливает my_super_secure_cookie некоторый защищенный токен, а сервер № 1 декодирует и проверяет его. Вот этот код:

 @Configuration
class SecurityConfig extends WebSecurityConfigurerAdapter {
    // Some code
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/rest/public/*").permitAll()
            .anyRequest().authenticated();

    }
    // More code
}  


public class SuperSecurityFilter extends FilterSecurityInterceptor implements Filter {
    public SuperSecurityFilter(String key) {
        super(key);
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        Cookie[] cookies = req.getCookies();

        Optional<Cookie> tokenCookie = Arrays.stream(cookies).filter(cookie -> cookie.getName().equals("my_super_secure_cookie")).findFirst();

        if (tokenCookie.isPresent()) {
            Cookie cookie = tokenCookie.get();
            TokenCookie.create(cookie.getValue()).validate();
        } else {
            throw new Exception("Ooops!"));
        }

        chain.doFilter(req, res);
    }
}
 

Вопрос в том, как мне настроить SecurityConfig использование SecurityTokenFilter по запросу любого из методов /rest/public/* rest. Что-то вроде:

 http
    .antMatcher("/rest/public/*")
    .addFilterBefore(new SuperSecurityFilter());  
 

не работает, SuperSecurityFilter не вызывается по запросу.

p.s. Я вынужден работать с этим типом модели безопасности из-за текущих ограничений бизнес-логики.

Ответ №1:

Я решил (применил обходной путь?) проблема, с которой я сталкиваюсь, заключается в реализации не фильтра, а перехватчика, например:

 public class SuperSecurityInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // implementation here
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // Nothing here
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // Nothing here
    }
}  
 

И зарегистрировал этот перехватчик в моем расширении сущности WebMvcConfigurerAdapter . Вот так:

 registry.addInterceptor(new SupeSecurityInterceptor()).addPathPatterns("/rest/public/*");  
 

Не уверен, что это правильно… В любом случае было бы приятно узнать о традиционном подходе к реализации функциональности такого типа.