🔥 Как подключить Keycloak к Spring Boot проекту
Keycloak — это современный open-source Identity Provider от Red Hat, который часто используется в enterprise-проектах для SSO (Single Sign-On), OAuth2 и OpenID Connect. Ниже — пошаговая настройка интеграции Keycloak с Spring Boot 3 и Spring Security 6.
1️⃣ Зависимости
Проверьте, что в проекте есть или добавьте следующие зависимости:
— Spring Web
— Spring Security
— OAuth2 Resource Server
— OAuth2 Client
2️⃣ Разворачиваем Keycloak
Запустите Keycloak через Docker:
После запуска откройте http://localhost:8080, войдите под admin/admin и создайте realm, например demo-realm.
3️⃣ Настройка клиента в Keycloak
В разделе Clients → Create client укажите:
— Client ID: spring-client
— Client Protocol: openid-connect
— Root URL: http://localhost:8081
В разделе Settings:
— Установите Access Type → confidential
— Включите Standard Flow Enabled
— Укажите Redirect URI: http://localhost:8081/login/oauth2/code/keycloak
Сохраните и перейдите на вкладку Credentials — скопируйте Client Secret.
4️⃣ Настройка application.yml
5️⃣ Конфигурация безопасности
Настройте SecurityConfig.java:
🧠 Зачем это нужно:
Keycloak снимает с вас головную боль по хранению паролей, управлению ролями и сессиями. Он интегрируется с LDAP, AD, SAML и десятками внешних OAuth-провайдеров.
🐸 Библиотека джависта
#Enterprise
Keycloak — это современный open-source Identity Provider от Red Hat, который часто используется в enterprise-проектах для SSO (Single Sign-On), OAuth2 и OpenID Connect. Ниже — пошаговая настройка интеграции Keycloak с Spring Boot 3 и Spring Security 6.
Проверьте, что в проекте есть или добавьте следующие зависимости:
— Spring Web
— Spring Security
— OAuth2 Resource Server
— OAuth2 Client
Запустите Keycloak через Docker:
docker run -d \
-p 8080:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:25.0.2 start-dev
После запуска откройте http://localhost:8080, войдите под admin/admin и создайте realm, например demo-realm.
В разделе Clients → Create client укажите:
— Client ID: spring-client
— Client Protocol: openid-connect
— Root URL: http://localhost:8081
В разделе Settings:
— Установите Access Type → confidential
— Включите Standard Flow Enabled
— Укажите Redirect URI: http://localhost:8081/login/oauth2/code/keycloak
Сохраните и перейдите на вкладку Credentials — скопируйте Client Secret.
server:
port: 8081
spring:
security:
oauth2:
client:
registration:
keycloak:
client-id: spring-client
client-secret: YOUR_CLIENT_SECRET
scope: openid, profile, email
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
keycloak:
issuer-uri: http://localhost:8080/realms/demo-realm
Настройте SecurityConfig.java:
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/public").permitAll()
.anyRequest().authenticated()
)
.oauth2Login(Customizer.withDefaults())
.logout(logout -> logout
.logoutSuccessUrl("/")
.invalidateHttpSession(true)
);
return http.build();
}
}
🧠 Зачем это нужно:
Keycloak снимает с вас головную боль по хранению паролей, управлению ролями и сессиями. Он интегрируется с LDAP, AD, SAML и десятками внешних OAuth-провайдеров.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥1
🔥 Когда понимаешь SOLID — жизнь становится проще
В октябре действует скидка 40% на все курсы от Proglib Academy, включая интенсив «Архитектуры и шаблоны проектирования»
📘 На интенсиве ты:
— разберёшься, как проектировать приложения, которые не ломаются при каждом изменении;
— освоишь SOLID-принципы, IoC, адаптеры и фабрики;
— научишься строить масштабируемые архитектуры;
— создашь собственную игру «Звёздные войны».
👨💻 Примеры кода на C#, Java, Python, PHP, C++ и JavaScript. Главное — понимать принципы, а не язык.
Преподаватель — Евгений Тюменцев, директор компании HWdTech, разрабатывал многопоточные кроссплатформенные приложения для IBM Watson.
📆 Формат: онлайн, 1 месяц.
📚 9 лекций + 2 бонусных занятия + практика.
Интенсив подойдёт джунам, которые хотят апнуться до мидла, и мидлам, мечтающим о роли архитектора.
👉 Переходи к курсам со скидкой 40%
В октябре действует скидка 40% на все курсы от Proglib Academy, включая интенсив «Архитектуры и шаблоны проектирования»
📘 На интенсиве ты:
— разберёшься, как проектировать приложения, которые не ломаются при каждом изменении;
— освоишь SOLID-принципы, IoC, адаптеры и фабрики;
— научишься строить масштабируемые архитектуры;
— создашь собственную игру «Звёздные войны».
👨💻 Примеры кода на C#, Java, Python, PHP, C++ и JavaScript. Главное — понимать принципы, а не язык.
Преподаватель — Евгений Тюменцев, директор компании HWdTech, разрабатывал многопоточные кроссплатформенные приложения для IBM Watson.
📆 Формат: онлайн, 1 месяц.
📚 9 лекций + 2 бонусных занятия + практика.
Интенсив подойдёт джунам, которые хотят апнуться до мидла, и мидлам, мечтающим о роли архитектора.
👉 Переходи к курсам со скидкой 40%
❤1
ConcurrentHashMap — это потокобезопасная реализация хэш-таблицы из пакета java.util.concurrent. В отличие от обычного HashMap, он допускает одновременные операции чтения и записи без глобальной блокировки всей таблицы.
📦 Базовая структура
Внутри ConcurrentHashMap хранит данные в массиве Node<K,V>[] table, где каждый элемент массива — это цепочка (связанный список или дерево).
Главная особенность:
— Вся таблица не блокируется целиком.
— Блокируется только нужный бакет при изменении.
— Для мелких структур используется synchronized на уровне ноды, для больших — tree bin locks (аналог TreeMap).
🔍 Как устроено хранение
— При вставке ключ хэшируется, чтобы равномерно распределить данные по бакетам.
— Каждая ячейка может содержать:
• Node — обычная запись (ключ/значение/ссылка).
• TreeBin — сбалансированное дерево при переполнении бакета (>8 элементов).
— Чтения (get) работают без блокировок, просто читают volatile-ссылки.
⚡️ Операции вставки и удаления
— put(K key, V value):
1. Высчитывается индекс бакета.
2. Если ячейка пустая, создаётся новая нода через CAS (Compare-And-Swap).
3. Если нет, блокируется только этот бакет (synchronized (f)), выполняется вставка.
— remove(Object key):
1. Определяется бакет.
2. Захватывается локальная блокировка на уровне бакета.
3. Узел удаляется, при необходимости структура перестраивается.
Сложность операций — O(1) в среднем случае, но с учётом блокировок.
🌊 Итераторы
Итераторы в ConcurrentHashMap — weakly consistent:
— Не выбрасывают ConcurrentModificationException.
— Видят часть изменений, сделанных другими потоками (в отличие от CopyOnWriteArrayList).
— Итерация не требует блокировок и не мешает параллельным вставкам или удалению.
📊 Производительность
— get() → практически O(1), без блокировок.
— put() / remove() → O(1) в среднем, но с локальной синхронизацией.
— Итерация → O(n), стабильная, но может не отражать все изменения.
⚖️ Важные нюансы
— С 8-й Java ConcurrentHashMap отказался от сегментов (Segment[]), теперь всё управляется атомарными операциями CAS и локальными синхронизациями.
— Не допускает null ключей и значений (в отличие от HashMap).
— Внутри используется LongAdder для счётчиков, чтобы избежать ложного sharing-а.
🧮 Когда использовать
— Часто читаемые и обновляемые словари (например, кэш, статистика, счётчики).
— Реализация пулов подключений, очередей задач, метрик и хранилищ состояний.
— Когда важно масштабирование под многоядерные системы без глобальных блокировок.
❗️ Не использовать, если:
— Обновления редки → Collections.synchronizedMap проще и дешевле.
— Нужен строгий порядок → лучше ConcurrentSkipListMap.
🔗 Документация: JavaDoc (Java 17)
Ставьте 🔥, если хотите разбор ConcurrentSkipListMap или LinkedBlockingQueue.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍2👏1
Forwarded from Библиотека задач по Java | тесты, код, задания
Почему контроллер возвращает просто текст, а не HTML-страницу?
Anonymous Quiz
18%
Нет аннотации @ResponseBody
54%
из-за @RestController, а нужен @Controller
16%
Ошибка в шаблонизаторе
3%
из-за @GetMapping, а нужен @PutMapping
9%
Посмотреть ответ
👍5🔥3👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁14👍4🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15🔥3👍2