Весенняя безопасность
Spring Security - это структура безопасности, которая может обеспечить комплексные решения для контроля за безопасным доступом для проектов J2EE. Это полагается на фильтры сервлета. Эти фильтры перехватывают входящие запросы и выполняют некоторую обработку безопасности, прежде чем приложение обработает запрос.
Spring Security перехватывает запросы пользователей следующим образом:
фон
В проекте, который отделен от передней и задней части, Springsecurity используется в качестве структуры безопасности, и JWT используется для реализации управления разрешениями для повышения безопасности API RESTFUL. Первое, что я столкнулся, была проблема с междоменом, но в процессе переноса запроса JWT сервер не смог получить JWT.
Проблемы с доменом
В процессе разработки я столкнулся с проблемой CORS (кросс-доменное обмен ресурсами). Я просто установил доступ к перекрестному домену на стороне сервера, но он произошел в процессе переноса запроса JWT.
Поскольку JWT помещается в заголовок запроса, он игнорирует, что переработка междоменной обработки должна добавить поле заголовка, которое позволяет себе установить.
@Componentpublic class corsfilter реализует Filter {logger logger = loggerfactory.getLogger (corsfilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request= (HttpServletRequest) servletRequest; Httpservletresponse response = (httpservletresponse) Servletresponse; response.setheader ("Access-Control-Oright-Origin", request.getheader ("Origin")); response.setheader ("Access-Control-Oright-Origin", "*"); //Response.setheader("access-control-llow-methods","post,getmoptions, delete, pult "); // метод запроса, разрешенный для использования response.setheader ("Access-Control-Expose-Headers", "*"); response.setheader («Контроль Access-Control-Hallowers», «x-requested-with, контроль от кэша, прагма, тип контента, авторизация»); // метод запроса, разрешенный для использования response.setheader («Access-Control-Allow-Credentials», «True»); // метод запроса, разрешенный для использования response.setheader («Access-Control-Allow-Credentials», «True»); // разрешать ли запросы с помощью информации о проверке FilterChain.dofilter (ServletRequest, Servletresponse); } @Override public void destry () {}} Поиск онлайн упомянул, что необходимо обрабатывать запросы на опционы и возврат 200, но тест не сработал
Запрос на параметры здесь на самом деле является запросом
Предварительный запрос
Но проблема не была решена, следующим образом
Только после Google известно о информации о запросе предварительного полета
Когда мы называем фоновый интерфейс, мы часто обнаруживаем, что мы просили дважды. Фактически, первый раз, когда мы отправляем запрос на предварительную работу (запрос на предварительную работу).
Зачем вам нужен запрос
Мы все знаем, что та же политика браузеров с той же оригинкой заключается в том, что по соображениям безопасности браузеры будут ограничивать междоменные HTTP-запросы, инициированные из сценариев. Xmlhttprequest и все принесли все политики.
Обычно у браузеров есть два способа ограничить перекрестные запросы:
Браузер ограничивает выдачу перекрестных запросов и перекрестных запросов. Поперечные запросы могут быть инициированы нормально, но возвращаемый результат перехвачен браузером.
Как правило, браузеры ограничивают перекрестные запросы во втором пути, то есть запрос прибыл на сервер и может работать на данных в базе данных. Тем не менее, возвращаемый результат перехвачен браузером, поэтому мы не можем получить результат возврата. Это неудачный запрос, но он может оказать влияние на данные в базе данных.
Чтобы предотвратить это, спецификация требует, чтобы для этого метода HTTP-запроса, который мог иметь побочные эффекты на данные сервера, браузер должен сначала использовать метод параметров, чтобы инициировать запрос на предварительную поле зрения, чтобы узнать, разрешает ли сервер запрос поперечного домена: если разрешено, отправить реальный запрос с данными; Если не разрешено, предотвратите отправку реального запроса с данными.
Браузер делит запросы CORS на две категории: простые запросы и непреодолимые запросы.
Простой запрос
1. Метод запроса является одним из следующих трех методов
2. Информация о заголовке HTTP не превышает следующие поля
Любой, кто не соответствует двум вышеупомянутым условиям одновременно,-это не простой просьба.
Браузер обрабатывает эти два запроса по -разному.
Нет простого запроса
Несоточный запрос-это запрос, который имеет особые требования для сервера, например, метод запроса помещается или удаляется, или тип поля типа контента-Application/JSON.
Запрос CORS, который не является простым запросом, добавит запрос на запрос HTTP перед официальным сообщением, которое называется запросом «предварительно полезно» (предварительный поле)
Для получения более подробной ссылки на CORS, пожалуйста, обратитесь к ссылке внизу.
Решение
На нашем прошлом безопасность Spring используется в качестве структуры безопасности, и в запросе предварительного выполнения не проводится соответствующая обработка, поэтому этот запрос приведет к сбою управления разрешением.
Это также очень просто в обработке. Вам нужно только добавить запрос Preflight для выпуска к методу конфигурации конфигурации безопасности Spring.
@Override Protected void configure (httpsecurity http) бросает исключение {http // Поскольку мы используем JWT, нам не нужны csrf .csrf (). Disable () // На основе токена, нам не нужно сессион. Запросы для/выпущены. requestmatchers (corsutils :: ispreflightrequest) .permitall () // Выпуск preflight.antmatchers ("/*"). armitall () .antmatchers ("/u"). denyall () .antmatchers ("/article/**"). Permitall (). .antmatchers ("/api/**"). armitall () .antmatchers ("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**","/swagger-ui.html", "/webjars/** .antmatchers ("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**","/swagger-ui.html", "/webjars/**") .permitall () .antmatchers ("/Manage/**). Выше требуется аутентификация. AnyRequest (). Authenticated (); // Отключить кэш http.headers (). Cachecontrol (); // Добавить jwt filter http.addfilterbefore (AuthenticationTokenFilterBean (), userNamePassWordAuthenticationFilter.class); // Добавить несанкционированную обработку http.exceptionHandling (). AuthenticationEntryPoint (getAuthenticationEntryPoint ()); // Недостаточно разрешений обрабатывает http.exceptionhandling (). }Проблема была наконец решена!
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.
См.
Фронт-Энд | Краткое обсуждение запроса на предварительное полете
Обмен перекрестными ресурсами CORS подробное объяснение