Получи случайную криптовалюту за регистрацию!

Записки разработчика

Логотип телеграм канала @devs_notes — Записки разработчика З
Логотип телеграм канала @devs_notes — Записки разработчика
Адрес канала: @devs_notes
Категории: Технологии
Язык: Русский
Количество подписчиков: 3

Рейтинги и Отзывы

3.00

3 отзыва

Оценить канал devs_notes и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

0

4 звезд

1

3 звезд

1

2 звезд

1

1 звезд

0


Последние сообщения

2022-10-12 09:16:56 Spring Security: основная архитектура

Времена сложные, но надеюсь вернуться в стабильное написание постов.

У многих разработчиков Spring Security — самый непонятный и нелюбимый модуль. Секрет успеха в работе с Security лежит в понимании двух вещей:

Используемый механизм безопасности

Вариантов и комбинаций много — БД, LDAP, JWT, разные схемы oAuth и SSO. При реализации должно быть чёткое понимание, что где хранится, куда передаётся, кто, как и что валидирует

Базовая архитектура Spring Security

Об этом и будет пост. Опишу простыми словами, что происходит в классической (не реактивной) архитектуре. Надеюсь, это поможет увидеть общую картину.

Глобально сфера Security делится на две большие части:

Путь запроса до контроллера и обратно

Схема такая:
Сервер получает запрос
Проводит его через цепочку фильтров, у каждого из которых своя задача:
CsrfFilter проверяет CSRF токен
SessionManagementFilter разбирается с сессией
И так далее, всего около 10-15 фильтров (количество зависит от конфига)
Запрос попадает в контроллер
Выполняется специфичная логика проекта
Контроллер возвращает ответ
Запрос проходит по той же цепочке фильтров, но в обратном порядке. Фильтры выставят у ответа нужные заголовки, обнулят/сохранят сессию и тд
Ответ возвращается пользователю

Что тут важно:

Проверка прав, заголовков и основные секьюрити штуки обрабатываются в фильтрах ДО вызова контроллера

Каждый фильтр может менять запрос/ответ или контекст, поэтому порядок фильтров имеет значение

За конфигурацию фильтров отвечает метод конфига WebSecurityConfigurerAdapter#configure(HttpSecurity http)

Чтобы увидеть процесс наглядно, поставьте брейкпойнт в методе FilterChainProxy#doFilterInternal. Там увидите все фильтры, можете погулять по ним и отследить, что происходит с запросом

Авторизация/аутентификация
скрывается за фасадом — бином AuthenticationManager.

Чтобы авторизовать пользователя, в коде проекта нужно вызвать метод

authenticationManager.authenticate

Может в фильтре, может в контроллере, зависит от механизма безопасности.

Метод authenticate пройдётся по всем заданным источникам авторизации. Результат можно положить в SecurityContextHolder, и он будет доступен из любого места в коде. Также бросится событие AuthenticationSuccessEvent, но обычно его игнорируют:)

Источники авторизации называются *Provider (например, DaoAuthenticationProvider) и определяются в конфиге. В итоге всё что нужно от разработчика это:

определить провайдеры
вызвать authenticate в нужном месте

Посмотреть список текущих провайдеров: брейкпойнт в методе ProviderManager#authenticate.

Задать список провайдеров: определить в конфиге WebSecurityConfigurerAdapter метод configure(AuthenticationManagerBuilder auth)

Что с этим знанием делать на практике

Если вам дали задачу на настройку Spring Security, не бросайтесь сразу гуглить

spring security jwt/oauth/ldap example

Велик шанс сделать что-нибудь не то. Лучше сделать так:

Шаг 1 (самый важный): разобраться в механизме безопасности, который нужно реализовать. Что, откуда и как передаётся, где и как валидируется и сохраняется

Шаг 2: прикинуть, как эти требования ложатся на архитектуру секьюрити. Что сделать в фильтрах, а что отдельным методом

Шаг 3 (желательный): обсудить полученное решение со старшим товарищем

Теперь можно гуглить и выбрать подходящий туториал. Поняв, что именно искать, вы в итоге потратите меньше времени и сохраните высокую самооценку
1 view06:16
Открыть/Комментировать
2022-07-27 14:01:33

1 view11:01
Открыть/Комментировать
2022-07-25 22:25:41 https://borshev.com/slack-productivity/
1 view19:25
Открыть/Комментировать
2022-06-17 09:35:04 Переключение между задачами

Иногда во время работы над одной задачей нужно переключиться на другую: поправить пул реквест или сделать хотфикс. Если текущие изменения не готовы для полноценного коммита, можно использовать stash или shelve.

Stash

Изменения сохранятся в локальном git репозитории, а текущая ветка почистится. Можно спокойно переключаться на другую задачу.

git stash save "stash name"
В IDEA: VCS → Git → Stash Changes...

Вернуть изменения на место:
git stash apply "stash name"
и оставить stash в локальном репозитории
git stash pop "stash name"
и удалить стэш
В IDEA: VCS → Git → Unstash Changes...

Что важно:
Сохраняются ВСЕ текущие изменения в ветке
Обратно применяются ВСЕ изменения в стэше
Изменения хранятся в локальном git репозитории

Shelve

Удобная фича IDEA для сохранения части изменений:

VCS → Shelve Changes...
Галочками отмечаем, что сохранить.

Чтобы вернуть обратно:
Вкладка Git (Alt + 9 или найдите внизу) → Shelve
Отмечайте, какие изменения применить к коду

Можно выбрать, что сохранять
Можно указать, что восстановить
Изменения хранятся в локальном IDEA проекте
4 views06:35
Открыть/Комментировать
2022-05-13 22:52:54 https://habr.com/ru/company/yandex/blog/442762/

#api #архитектура #rest #идемпотентность
5 viewsedited  19:52
Открыть/Комментировать
2022-02-14 11:44:56 https://medium.com/@kirill.sereda/reactive-programming-reactor-и-spring-webflux-3f779953ed45
https://medium.com/@kirill.sereda/reactive-programming-reactor-и-spring-webflux-часть-2-a0273a5d4ebd


#spring #webflux #reactor #reactive
8 viewsedited  08:44
Открыть/Комментировать
2021-10-17 15:44:15 https://le0nidas.gr/2021/02/23/lets-build-a-coroutine/

#kotlin #coroutine
11 views12:44
Открыть/Комментировать
2021-09-10 23:44:13 Использование byte, short в Java

Большинство реализаций JVM хранят примитивные типы данных в ячейках размером 32/64 бита. Поэтому типы boolean, byte, short, int будут использовать одинаковое кол-во памяти. Как показывают тесты, работа с byte и short, вместо int, приводит к снижению производительности при умножении.

Но при создании массивов byte или short JVM умеет "упаковывать" примитивные типы так, что 32-х битная ячейка будет содержать 4 переменных типа byte, вместо одной. Что, потенциально, может уменьшить кол-во потребляемой памяти.

Ссылки:
https://stackoverflow.com/questions/14531235/in-java-is-it-more-efficient-to-use-byte-or-short-instead-of-int-and-float-inst
https://stackoverflow.com/questions/1539793/in-java-does-anyone-use-short-or-byte

#java #kotlin #memory #optimization
19 views20:44
Открыть/Комментировать
2021-08-10 13:35:25 Статьи для ознакомления с ClickHouse

Документация ClickHouse:
https://clickhouse.tech/docs

Устройство *MergeTree движков:
https://habr.com/ru/post/539538/

Работа с движком Kafka:
https://altinity.com/blog/2020/5/21/clickhouse-kafka-engine-tutorial

#clickhouse #kafka
15 viewsedited  10:35
Открыть/Комментировать
2021-06-02 14:41:13 Удаление больших партиций ClickHouse

Если размер партиции превышает max_table_size_to_drop (по-умолчанию 50 Гб), то удалить ее запросом DROP не получится. Перед удалением каждой такой партиции необходимо создать файл /flags/force_drop_table:

sudo touch '/var/lib/clickhouse/flags/force_drop_table' && sudo chmod 666 '/var/lib/clickhouse/flags/force_drop_table'

#clickhouse
20 viewsedited  11:41
Открыть/Комментировать