Как именно работает фильтр безопасности 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 ответ:
Да, вы правы. Фильтры существуют в спецификации сервлетов для сквозных задач, таких как" промежуточное ПО " в других веб-стеках. Все фильтры вызываются до того, как запрос обрабатывается сервлетом. Они могут выбрать короткое замыкание запроса или позволить ему двигаться вниз по цепочке. Как правило, используют фильтр, чтобы включить gzip-сжатия, аутентификации, добавить CORS-заголовки и тому подобное.
Spring перехватывает все запросы через свой фильтр. Они в основном перехватывают все запросы через этот механизм и используют их собственная внутренняя маршрутизация алгос и безопасность с этого момента. Вот почему вам не нужно регистрировать обработчики как сервлеты в web.да, но только весной.