Фреймворк Spring Security


Модуль 02. Аутентификация


Дворжецкий Юрий

2.1. Аутентификация

Порядок проведения аутентификации (часть 1)

  1. SecurityContextPersistenceFilter создаёт SecurityContext
  2. Какой-то из фильтров аутентификации (первичной или вторичной) достаёт логин и пароль (или токен) и создаёт объект Authentication (authenticated=false)
  3. FilterSecurityInterceptor достаёт объект Authentication (authenticated=false) и передаёт его в AuthenticationManager

Порядок проведения аутентификации (часть 2)

  1. AuthenticationManager передаёт объект Authentication в AuthenticationProvider
  2. Authentication Provider создаёт новый объект Authentication (authenticated=true)
  3. FilterSecurityInterceptor кладёт готовый объект Authentication в SecurityContext

Порядок проведения аутентификации (часть 3)

  1. В случае неуспешной аутентификации или отсутствие начального Authentication, AuthenticationManager/AuthenticationProvider или FilterSecurityInterceptor, соответственно, бросают Exception
  2. Этот Exception как раз обрабатывается ExceptionTranslationFilter, предшествующий FilterSecurityInterceptor.
  3. ExceptionTranslationFilter генерирует статус 401

Вопросы?

2.2. HTTP Basic аутентификация

HTTP Basic

  • Является стандартным расширением HTTP
  • Определена в RFC 7617
  • Основная идея — каждый запрос передаётся логин и пароль пользователя

HTTP Basic


GET https://example.com/any-url
Authorization: Basic dXNlcjpwYXNzd29yZA==

# Base64(user:password)
        

HTTP Basic аутентификация

Упражнение

  • Какие плюсы и минусы HTTP Basic аутентификации?

Плюсы HTTP Basic

  • До безобразия простая
  • Встроенная поддержка всех браузеров
  • Какой-никакой стандарт
  • Идеальная для веб-сервисов (REST в чистом виде)
  • Аутентификация передаётся в заголовке
  • Никаких cookies

Минусы HTTP Basic

  • Без HTTPS – мы просто отдаём логин-пароль злоумышленнику
  • Невозможная кастомизация логина (SMS, прочее)
  • А как сделать Logout?

Вопросы?

Упражнение

  1. Задайте Realm для HTTP Basic аутентификации
  2. Смайлик в чат, кто сделал

Вопросы?

2.3. Form-based аутентификация

Form-based аутентификация

  • Фактически это не схема аутентификации, а общий принцип
  • Означает "использование формы логина"
  • В действительности может отличаться и варьироваться

Form-based аутентификация

Упражнение

  • Какие плюсы и минусы Form-based аутентификации?

Плюсы Form-based аутентификации

  • Кастомизация UI для веб-приложений
  • Кастомизация процесса аутентификации (двухфакторная, капча)
  • Самая популярная схема
  • Логаут лёгкий — удаляем куку

Минусы Form-based аутентификации

  • Обычно для веб-сервисов как-то отдельно пропускают логин и сразу выдают токен.
  • Без HTTPS мы просто отдаём логин-пароль злоумышленнику
  • Необходима ещё и «вторичная» аутентификация
  • Logout на всех устройствах не так просто сделать

ДЕМО

  • Настройка Form-based аутентификации в Spring Security

Вопросы?

Лабораторная №3

  1. Выключите STATELESS режим.
  2. Добавьте конфигурацию .formLogin().
  3. Сделайте страницу доступной всем пользователям.
  4. *Создайте свою собственную login-страницу.
  5. Число 3 в чат, как сделаете.

Вопросы?

2.4. Anonymous аутентификация

Anonymous аутентификация

  • Это вторичный механизм аутентификации.
  • Это паттерн Null Object в применении к Security
  • Соответствующий фильтр создаёт «минимального» пользователя, если ни один фильтр первичной аутентификации не создал объект Authentication.
  • Позволяет проще реализовывать концепцию Deny by Default.

Упражнение

Приведите примеры паттерна Null Object в разработке/реальной жизни

Упражнение

Приведите примеры паттерна Null Object в разработке/реальной жизни

  • Страница 404
  • NoOp-логгер
  • Collections.emptyList()

Anonymous аутентификация

  • Существует отдельный раздел DSL для конфигурации анонимной аутентификации — .anonymous()
  • Нужен он для настройки того самого пользователя, который будет
  • Но фильтр анонимной аутентификации включается при наличии .permitAll()

ДЕМО

  • Реализация CurrentUserService
  • Использование его в различных методах (с обычной и анонимной аутентификациями)
  • Настройка anonymous-аутентификации, чтобы избежать ошибок

Лабораторная №4

  • Настроить anonymous-аутентификацию, чтобы избежать ошибок c UserDetails
  • *Реализуйте endpoint /whoami, который возвращает имя текущего пользователя (включая анонимного).
  • Число 4 в чат, как сделаете

Вопросы?

2.5. Remember-me аутентификация

Remember-me аутентификация раньше

  • Раньше объект Authentication хранился в сессии.
  • Между запусками сервера или при бездействии пользователя, сессия удалялась.
  • Поэтому возникала необходимость вторичной аутентификации пользователя между сессиями.
  • Эта та самая галочка «Запомнить меня»

Remember-me аутентификация сейчас

  • В REST нет сессий.
  • И между запросами (а они могут приходить на разные сервера) теперь обязательно нужно аутентифицировать пользователя
  • Собственно, сейчас это поведение по умолчанию для REST-приложений

Токены в Remember-me

Для реализации подобного функционала после первичной аутентификации пользователю возвращается некоторый токен: в cookies или просто в ответе на запрос.

Токены могут быть разные:

  • Persistent tokens (или случайно-генерируемые)
  • Hash-based (или Signature-based)
  • JWT (на самом деле, это Signature-based)

Случайно-генерируемые (Persistent)

  • Генерируется случайная последовательность байт какой-то длины
  • Сохраняется в БД с информацией о пользователе, которому выдан, и возвращается в ответе
  • При вторичной аутентификации производится поиск токена от пользователя в БД
  • Если токен найден — пользователь сохраняется в Authentication

Упражнение

  • Какие плюсы и минусы случайно-генерируемых (Persistent) токенов?

Плюсы Persistent tokens

  • Достаточно просты в реализации
  • При безопасном генераторе случайных чисел — это фактически абсолютная защита
  • И не нужно никакой криптографии
  • Логаут со всех устройств — легко!

Минусы Persistent tokens

  • Токены нужно хранить
  • Это расходы на хранение (память/жёсткий диск)
  • Если мы не пользуемся сессиями (REST), то при любом запросе на сервер происходит запрос к БД

Упражнение

Есть Welcome-страница с текстом «Привет на нашем сайте, ${username}!».

Когда будет происходить обращение к БД при использовании случайно-генерируемых (Persistent) токенов?

  • При проверке токена реального пользователя или подделанного злоумышленником?
  • При получении имени и прав пользователя?

Упражнение

Есть Welcome-страница с текстом «Привет на нашем сайте, ${username}!».

Когда будет происходить обращение к БД при использовании случайно-генерируемых (Persistent) токенов?

  • При проверке токена реального пользователя или подделанного злоумышленником?
  • При получении имени и прав пользователя?

ДЕМО

  1. Конфигурация Persistent-token подхода

Hash-based tokens


base64(
    username + ":" + expirationTime + ":" +
    md5Hex(username + ":" + expirationTime +
            ":" + password + ":" + key)
)
        

Упражнение

  • Какие плюсы и минусы Hash-based токенов?

Плюсы Hash-based токенов

  • Не нужно лезть в БД при проверке!
  • Но не в дефолтной реализации Spring Security :)
  • Совсем немного криптографии

Минусы Hash-based токенов

  • Сделать логаут со всех устройств не получится.
  • Для этого как раз нужно хранить токены.

Упражнение

Есть Welcome-страница с текстом «Привет на нашем сайте, ${username}!».

Когда будет происходить обращение к БД при использовании Hash-based токенов?

  • При проверке токена реального пользователя или подделанного злоумышленником?
  • При получении имени и прав пользователя?

Упражнение

Есть Welcome-страница с текстом «Привет на нашем сайте, ${username}!».

Когда будет происходить обращение к БД при использовании Hash-based токенов?

  • При проверке токена реального пользователя или подделанного злоумышленником?
  • При получении имени и прав пользователя?

ДЕМО

  1. Конфигурация Hash-based подхода

JWT (JSON Web Token)

  • Эволюция hash-based токенов.
  • Условно JWT = JSON + подпись.
  • Допускает дополнительную информацию в JSON.
  • RFC-7591 на JWT.

JWT


{
  "alg": "HS512",
  "typ": "JWT"
}

{
  "sub": "12345",
  "name": "John Gold",
  "admin": true
}

signature
        

JWT


eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NSIsIm5hbWUiOiJKb2huIEdvbGQiLCJhZG1pbiI6dHJ1ZX0K.
LIHjWCBORSWMEibq-tnT8ue_deUqZx1K0XxCOXZRrBI
        

JWT (JSON Web Token)

  • Header состоит из информации о шифровании
  • Payload состоит из claims
  • Вы можете добавлять свои claims
  • Обмен секретами для signature позволяет осуществлять выдачу на одном сервере (Authorization Server), а проверку осуществлять на сервере приложения (Application)

Упражнение

  • jwt.io
  • Я буду выступать в роли Authentication Server, Вы — Application.
  • Обмениваемся секретами.
  • Я выдаю пользователю токен.
  • Вы валидируете этот токен.

Упражнение

  • Какие плюсы и минусы JWT?

Плюсы JWT

  • Не нужно лезть в БД при проверке!
  • Можно добавлять дополнительную информацию, об авторизации, например

Минусы JWT

  • Сделать логаут со всех устройств не получится.
  • Для этого как раз нужно хранить токены.
  • Всё-таки есть криптография.

Упражнение

Есть Welcome-страница с текстом «Привет на нашем сайте, ${username}!».

Когда будет происходить обращение к БД при использовании JWT?

  • При проверке токена реального пользователя или подделанного злоумышленником?
  • При получении имени и прав пользователя?

Упражнение

Есть Welcome-страница с текстом «Привет на нашем сайте, ${username}!».

Когда будет происходить обращение к БД при использовании JWT?

  • При проверке токена реального пользователя или подделанного злоумышленником?
  • При получении имени и прав пользователя?

Вопросы?

Лабораторная №5

  1. Включите STATELESS стратегию работы с сессиями.
  2. Настройте Remember-me аутентификацию с Hash-based токенами.
  3. *Реализуйте Persistent token-подход.
  4. Число 5 в чат, как сделаете.

Вопросы?

Спасибо за внимание!