Как именно работает фильтр безопасности Spring, объявленный в интернете.xml приложения Spring MVC?


Я довольно новичок в Spring, и у меня есть некоторые сомнения относительно того, как именно работает проект Spring Security, над которым я учусь.

Итак, вот содержание моего файла web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Spring_Web_App</display-name>
  <welcome-file-list>
    <welcome-file>/WEB-INF/jsp/index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/config/spring-security.xml</param-value>
  </context-param>

  <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>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

Из того, что я знаю содержание этой настройки:

  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

Не относится к конфигурации безопасности Spring, но указывает, что все запросы должны обрабатываться сервлетом Spring, конфигурация которого находится в файле с именем spring-servlet.xml. Это правильно?

Итак, анализируя Оператор Spring Security в файл web.xml я обнаружил, что конфигурация этого компонента объявляется в файле /WEB-INF/config/spring-security.xml следующим оператором:

ContextConfigLocation /WEB-INF / config / spring-security.XML

Тогда у меня есть объявление фильтра. Я не очень люблю фильтр, и это та тема, которая создает мне некоторые проблемы.

Из того, что я понял, фильтр-это то, что перехватывает запрос (как это делает сервлет), но в отличие от сервлета не делает верните ответ вызывающему объекту (страницу JSP пользователю или что-то в этом роде), но просто выполните некоторую операцию, прежде чем быстро переслать запрос сервлету, который должен обработать его и предоставить ответ на этот запрос. Таким образом, фильтр используется для обеспечения некоторой дополнительной логики, которая должна быть вне кода сервлета, потому что представляет некоторую конкретную задачу.

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

Итак, из того, что я понял, читая некоторую документацию, я должен объявить фильтр, этой строкой:

<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>

Поэтому я думаю, что аутентификация работает следующим образом: каждый HTTP-запрос перехватывается фильтром до того, как он передается сервлету, и если пользователь не авторизован (have не правильные учетные данные или не правильное правило установлено) запрос не обрабатывается сервлетом, и он не может получить доступ к странице.

Правильно ли я рассуждаю?

Формируют то, что я понял, пытаясь изучить архитектуру Spring, делегаты DelegatingFilterProxy в цепочку управляемых пружиной фильтров, которые:

  • аутентификация диска
  • принудительная авторизация
  • управление выходом из системы
  • поддерживать SecurityContext в HttpSession
  • и т. д.
1 2

1 ответ:

Да, вы правы. Фильтры существуют в спецификации сервлетов для сквозных задач, таких как" промежуточное ПО " в других веб-стеках. Все фильтры вызываются до того, как запрос обрабатывается сервлетом. Они могут выбрать короткое замыкание запроса или позволить ему двигаться вниз по цепочке. Как правило, используют фильтр, чтобы включить gzip-сжатия, аутентификации, добавить CORS-заголовки и тому подобное.

Spring перехватывает все запросы через свой фильтр. Они в основном перехватывают все запросы через этот механизм и используют их собственная внутренняя маршрутизация алгос и безопасность с этого момента. Вот почему вам не нужно регистрировать обработчики как сервлеты в web.да, но только весной.