#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/*");
Не уверен, что это правильно… В любом случае было бы приятно узнать о традиционном подходе к реализации функциональности такого типа.