РЕАЛИЗАЦИЯ АУТЕНТИФИКАЦИИ И АВТОРИЗАЦИИ ДЛЯ ВЕБ-ПРИЛОЖЕНИЯ С ПОМОЩЬЮ ФРЕЙМВОРКА SPRING SECURITY ДЛЯ JAVA
РЕАЛИЗАЦИЯ АУТЕНТИФИКАЦИИ И АВТОРИЗАЦИИ ДЛЯ ВЕБ-ПРИЛОЖЕНИЯ С ПОМОЩЬЮ ФРЕЙМВОРКА SPRING SECURITY ДЛЯ JAVA
Килев Даниил Олегович
студент, Белгородский государственный национальный исследовательский университет,
РФ, г. Белгород
Пилипенко Владислав Вадимович
студент, Белгородский государственный национальный исследовательский университет,
РФ, г. Белгород
IMPLEMENTING AUTHENTICATION AND AUTHORIZATION FOR A WEB APPLICATION USING THE SPRING SECURITY FRAMEWORK FOR JAVA
Daniil Kilev
Student, Belgorod State University,
Russia, Belgorod
Vladislav Pilipenko
Student, Belgorod State University,
Russia, Belgorod
АННОТАЦИЯ
Данная статья знакомит пользователей с таким принципом защиты приложения, как цепочка фильтров, рассказывает о основной части работы Фреймворка и рассказывает о возможных уязвимостях ИС, а также знакомит со способами решения данных проблем.
ABSTRACT
This article introduces users to such an application protection principle as a chain of filters, talks about the main parts of the Framework and talks about possible IS vulnerabilities, and also introduces ways to solve data problems.
Ключевые слова: Авторизация, аутентификация, идентификация, цепочка фильтров, CSRF.
Keywords: Authorization, authentication, identification, filter chain, CSRF.
В данной работе была рассмотрена задача реализации аутентификации и авторизации с помощью Spring Security. Данный Фреймворк позволяет backend-разработчику настраивать способы авторизации, варианты аутентификации, делегировать обязанности проверки учетных данных Фреймворку. Цель данной статьи является показать способы работы с Spring Security. Были поставлены две задачи: исследовать процесс защиты приложения на разных уровнях и рассмотреть варианты аутентификации в приложении.
Актуальность данной темы обусловлена необходимостью защиты серверной части приложения от несанкционированного доступа неавторизованных или неаутетифицированных пользователей.
Данная статья написана на основе официальной документации Spring Framework.
В качестве методологии статьи был выбран принцип цепочки фильтров (The security filter chain n.d.), необходимых для постепенной проверки запроса на различные критерии, которые и определяют степень защиты приложения. Для хранения данных была использована база данных либо Active Directory, язык программирования Java и Фреймворк Spring и его компонент Security.
У Spring Security есть ContextHolder (Spring Framework n.d.), который хранит в себе данные пользователей. Он является Thread Local переменной. В ContextHolder уже хранятся конкретные данные пользователей: principal – логин, credentials – секрет пользователя (Пароль) и Authorities – Права доступа.
Обработка всех запросов идёт через единственный сервлет: dipatcherServlet. Аутентификация происходит до DS. Сначала запрос проходит через цепочку фильтров. (Проверяет логин и пароль, проверяет на авторизацию, на возможные экспешины). Что происходит в цепочке фильтров? Запрос от клиента идёт на сервер, и цепочка фильтров ловит запрос и производит исключение. В цепочке есть обработчик исключений. Он перенаправляет на страницу логина. Вводим логин, пароль. В header есть referer (обратная ссылка). Форма логина после логина перенаправляет туда, куда хотел зайти пользователь.
Для получения данных о пользователе необходимо иметь источник данных, в котором и хранятся данные пользователей (Логин и кэшированный пароль). Для этого есть множество различных реализаций, но чаще всего используют базу данных с таблицами: user, authorities и roles или с помощью active directory.
Для аутентификации пользователя необходимо использовать Authentication provider. После получения на сервер запроса, данные пользователя перенаправляются на этот провайдер, который формирует usernameAndPasswordToken (Spring Framework n.d.). Данный токен используется совместно с userDetailService, который и имеет доступ к базе данных. Пароль кэшируется в необходимый (в зависимости от того, что указал разработчик), и сравнивается с тем, что лежит в базе. Если совпадение есть, то пользователя пропускают по данным его Authorities.
Для защиты данных пользователя от кросс-сайтовой подделки куки существует так называемый CSRF (CSRF n.d.). CSRF - защита приложения от вредоносных запросов. В чем его смысл? Представим, что есть форма на сайте банка, где можно вбить свои данные и переслать кому-то деньги.
Мы вводим данные: Кол-во денег, получатель, данные аккаунта и кнопка submit. Чтобы сервер понимал, что это нужный пользователь существует jsessionid. Если мы открыли страницу, ввели данные, вошли в систему, закрыли страницу и через несколько минут вошли опять, то мы до сих пор авторизированы (куки не чистятся). Сторонний сайт не может прочитать наши куки, но как он может поступить? Мы можем зайти на другой сайт, где будет форма с методом пост и action таким же, как в банке, поэтому, когда мы нажмем submit, данные пойдут не на сервер мошенников, а в банк. Внутри формы мошенников могут быть скрытые поля. В них может забиты такие данные, как кол-во денег, куда отсылать и т.д. Когда мы нажмем submit плохой сайт отправит запрос в банк, вместе с запросом полетят и наши куки, что приведет к плохим последствиям. Чтобы такого не было делаются специальные токены. В пост запросе в токене должны быть присланы не только данные, но и уникальный токен CSRF.
Для подтверждения информации выше был проведен эксперимент: было создано классическое приложение на Java с maven и зависимостями spring framework (boot в том числе). Была создана web-конфигурация с авторизацией запросов через basicAuth и получением данных пользователей через Active Directory, так же был настроен CSRF для локального домена с портом 8081. Теперь при попытке отправить запрос на сервер, в хедерах требуется Authorization и данные пользователя (Логин и пароль), а при попытке отправить авторизированный запрос с какого-либо другого домена (localhost:8080, к примеру) через html форму или программу для запросов postman, сервер возвращает forbidden 403.
Таким образом Spring Security позволяет использовать цепочки фильтров запросов для защиты приложения, тем самым исключая проблемы не аутентифицированного доступа или кросс-сайтовой подделки куки.
Список литературы:
- Spring Framework: [Электронный ресурс]. URL: https://docs.spring.io/spring-security/reference/getting-spring-security.html (Дата обращения 20.11.2022).
- Уоллс К. Spring in action, Вашингтон, 2018 (Дата обращения 20.11.2022).
- Спилка Л. Spring security in action, New York, 2020 (Дата обращения 20.11.2022).