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]