Java spring -rest/Jersey, как безопасный маршрут отдыха с фильтром

Я использую следующее в pom.xml, которое фактически обеспечивает root маршрут, Я вижу процесс аутентификации, начинающийся в браузере в течение нескольких секунд

  <filter>
    <filter-name>CsrfFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CsrfFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Теперь у меня есть определенные маршруты, которые мне нужно защитить, когда пользователь их выбирает...

@Path("/run")
public class Service {


...

@GET
@Path("connect/{param}")
public Response connectToHost(@PathParam("param") String host) {

Как я должен это делать? через конфигурацию на помпе, как указано выше, или через код для каждого маршрута?

Ответ 1

В ваших вопросах есть некоторые путаные моменты, но я постараюсь осветить все, что могу.

ONE. настройки фильтра. В соответствии с вашим вопросом вы задали настройки фильтра в pom.xml. Но настройки фильтра всегда выполняются в файле web.xml. Если вы ошибочно назвали pom.xml, тогда проигнорируйте, но если нет, переместите настройки фильтра в web.xml.

TWO. В ваших тегах вопроса вы упомянули, что ваш запрос связан с spring -boot, spring -security. Но пример кода, который вы приложили, предполагает, что вы, возможно, используете трикотаж для создания apis отдыха и не используете spring, spring -security. Фактически вы пытаетесь использовать защиту csrf на более низком уровне на уровне сервера tomcat. Thats fine.

ТРЕХ. Защита CSRF может быть обеспечена с помощью spring безопасности, а также с помощью tomcat apis.

ЧЕТЫРЕ.. Если вы хотите понять, как защита spring обеспечивает защиту csrf для конечных точек отдыха, вам необходимо будет предоставить следующую конфигурацию в вашем коде.

@EnableWebSecurity
public class WebSecurityConfig extends
        WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}

Это обеспечит защиту csrf для всех запросов POST, PUT, PATCH, DELETE к вашему приложению. Подробнее см. https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html.

FIVE. Теперь для вашего фактического вопроса о том, как предоставить защиту csrf нескольким маршрутам вашим конечным точкам отдыха на основе трикотажа... Вы можете предоставить несколько шаблонов URL-адресов, например следующие.

<filter>
    <filter-name>CsrfFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CsrfFilter</filter-name>
    <url-pattern>/run</url-pattern>
    <url-pattern>/path1</url-pattern>
    <url-pattern>/path2</url-pattern>
</filter-mapping>

Обратитесь к https://tomcat.apache.org/tomcat-8.0-doc/config/filter.html#CSRF_Prevention_Filter_for_REST_APIs для получения более подробной информации о RestCsrfPreventionFilter.

Ответ 2

Прежде всего, фильтры должны быть добавлены в файл web.xml. Он должен не добавляться в файл pom.xml. pom.xml - это только манифест для создания вашего проекта.

Так как лучше всего защищать только определенные URL-адреса для вашего предполагаемого фильтра предотвращения CSRF, используйте определенные URL-адреса в отображении фильтра.

Пример указан для указанного пути /run.

   <filter>
    <filter-name>CsrfFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RestCsrfPreventionFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CsrfFilter</filter-name>
    <url-pattern>/run</url-pattern>
  </filter-mapping>

Пожалуйста, обратитесь к этой документации оракула, чтобы понять использование элементов web.xml.

Чтобы понять, что касается фильтрации запросов и ответов, обратитесь этот учебник оракула.

Обратитесь этот практический учебник о понимании мотыги для настройки фильтров как в методах XML, так и в методах аннотации. Обратите внимание, что вам не нужно выполнять настройки в обоих направлениях. Это можно сделать либо на основе xml, либо на основе аннотаций, поскольку вам удобно.

Ответ 3

Вам понадобится класс, который расширяет WebSecurityConfigurerAdapter

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {

    RequestMatcher csrfRequestMatcher = new RequestMatcher() {

      private AntPathRequestMatcher[] requestMatchers = {
          new AntPathRequestMatcher("/run/connect/**")
      };

      @Override
      public boolean matches(HttpServletRequest request) {
        for (AntPathRequestMatcher rm : requestMatchers) {
          // If request matches specified urls, apply csfr
          if (rm.matches(request)) { return true; }
        }
        return false;
      }

    }; 
    http
      // Enable csrf only on some request matches
      .csrf()
        .requireCsrfProtectionMatcher(csrfRequestMatcher)
      //Other configurations
  }
}

Ответ 4

Лучший способ защитить полный веб-сервис для отдыха, используя spring безопасность, если вы не используя никакой другой спецификации. 1. Используя способ spring, вам нужно объявить   Отображение фильтра →

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter- 
class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>  
2. Then you have to create a spring-security.xml that you can declare your 
method which you want to prevent to access.So you can ask for some 
authorization checked before accessing that methods. 
Follow this link

 [enter link description here][1]