Хотите писать код быстрее и без лишнего копипаста? Используйте Postfix Completion — умные сокращения, которые превращают выражения в полноценный код.
🔹 Что делает
— Превращает набранное выражение в готовую конструкцию (например, myVar.notnull → if (myVar != null) {...})
— Работает для условий, циклов, логирования, null-check и многого другого
— Доступна для Java, Kotlin и многих языков
🔹 Зачем это нужно
— Экономит время
— Снижает вероятность синтаксических ошибок
— Ускоряет рутинные действия (особенно null-checks)
🔹 Как использовать
— Пишите выражение, затем ставите точку и выбираете суффикс (например, .if, .for, .notnull)
— IDEA сама развернёт шаблон в готовый код
— Список доступных суффиксов: Settings → Editor → General → Postfix Completion
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥1
🎯 Как настроить аутентификацию с OAuth2
В Spring Boot 3 интеграция с OAuth2 стала ещё проще благодаря улучшенной поддержке социальных логинов. Рассмотрим, как настроить аутентификацию через Google с использованием Spring Security 6.
1️⃣ Создание проекта
Используйте Spring Initializr для создания проекта с следующими зависимостями:
— Spring Web
— Spring Security
— OAuth2 Client
Или добавьте их вручную в pom.xml:
2️⃣ Получение OAuth2-учётных данных Google
1. Перейдите в Google Cloud Console
2. Создайте новый проект
3. Перейдите в раздел APIs & Services → Credentials
4. Нажмите Create Credentials → OAuth 2.0 Client IDs
5. Укажите тип приложения Web application
6. Добавьте Authorized redirect URI
7. Сохраните и получите Client ID и Client Secret
3️⃣ Конфигурация application.yml
Добавьте следующие настройки в src/main/resources/application.yml:
Замените YOUR_CLIENT_ID и YOUR_CLIENT_SECRET на полученные значения.
4️⃣ Конфигурация безопасности
Создайте класс конфигурации:
🐸 Библиотека джависта
#Enterprise
В Spring Boot 3 интеграция с OAuth2 стала ещё проще благодаря улучшенной поддержке социальных логинов. Рассмотрим, как настроить аутентификацию через Google с использованием Spring Security 6.
Используйте Spring Initializr для создания проекта с следующими зависимостями:
— Spring Web
— Spring Security
— OAuth2 Client
Или добавьте их вручную в pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
1. Перейдите в Google Cloud Console
2. Создайте новый проект
3. Перейдите в раздел APIs & Services → Credentials
4. Нажмите Create Credentials → OAuth 2.0 Client IDs
5. Укажите тип приложения Web application
6. Добавьте Authorized redirect URI
7. Сохраните и получите Client ID и Client Secret
Добавьте следующие настройки в src/main/resources/application.yml:
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_CLIENT_ID
client-secret: YOUR_CLIENT_SECRET
scope:
- profile
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
authorization-grant-type: authorization_code
client-name: Google
provider:
google:
authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
token-uri: https://oauth2.googleapis.com/token
user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
user-name-attribute: sub
Замените YOUR_CLIENT_ID и YOUR_CLIENT_SECRET на полученные значения.
Создайте класс конфигурации:
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/login", "/error").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login()
.loginPage("/login")
.defaultSuccessUrl("/dashboard", true);
return http.build();
}
}
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3🔥2🎉1
Хотите править код сразу в нескольких местах? Multi-Caret Editing позволяет поставить несколько курсоров и синхронно редактировать текст.
🔹 Что делает
— Позволяет редактировать одинаковые участки кода одновременно
— Ускоряет массовое переименование переменных, правки форматирования и шаблонных конструкций
— Работает не только в коде, но и в файлах конфигурации, JSON, XML
🔹 Зачем это нужно
— Экономит время при рутинных правках
— Снижает вероятность пропустить один из повторяющихся фрагментов
— Делает код-ревью и рефакторинг быстрее
🔹 Как использовать
— Выделите слово и нажмите Alt+J (Windows/Linux) или Ctrl+G (macOS) — добавится второй курсор
— Продолжайте нажимать, чтобы выбрать следующие вхождения
— Для выбора сразу всех вхождений используйте Ctrl+Alt+Shift+J
— Для произвольных позиций используйте Alt+Click для добавления курсора в нужное место
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥2🤔2
🎯 Интеграционные тесты с Testcontainers
Пошаговая настройка тестов на Spring Boot 3 с Testcontainers + PostgreSQL: быстро, изолированно, воспроизводимо.
1️⃣ Зависимости (Maven/Gradle)
— Maven (pom.xml):
— Gradle (Kotlin DSL):
2️⃣ Включаем Testcontainers
C Spring Boot 3.1 контейнер можно подключить одной аннотацией без ручного прописывания spring.datasource.*.
3️⃣ Миграции для тестов (Flyway)
Положите миграции в src/test/resources/db/migration (отдельно от продовых — удобно для фикстур):
4️⃣ Ускоряем прогоны
▪️ Reusable containers (кэшируемый демон): добавьте в ~/.testcontainers.properties
и .withReuse(true) для контейнера в тесте.
▪️ Singleton-паттерн контейнера: вынесите контейнер в общий абстрактный класс теста, чтобы один контейнер работал на все тесты.
5️⃣ Полезные трюки и подводные камни
— Если на MacOS/Colima, проверьте доступность Docker API (docker info) перед тестами.
— Для детерминизма фиксируйте теги образов (например, postgres:16-alpine), не latest.
— Логи контейнеров доступны: postgres.followOutput(...) — удобно для диагностики нестабильных тестов.
— Если нужен R2DBC: поднимайте Postgres как выше, а в application-test.yml указывайте r2dbc URL; @ServiceConnection корректно сконфигурирует оба коннектора, если они в classpath.
— Тяжёлые фикстуры → создавайте через SQL-маски (V*_seed.sql) или @Sql прямо в тестах — не смешивайте тестовые данные с продовыми миграциями.
🐸 Библиотека джависта
#Enterprise
Пошаговая настройка тестов на Spring Boot 3 с Testcontainers + PostgreSQL: быстро, изолированно, воспроизводимо.
— Maven (pom.xml):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers-bom</artifactId>
<version>1.20.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
— Gradle (Kotlin DSL):
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
testImplementation("org.flywaydb:flyway-core")
testImplementation("org.postgresql:postgresql")
testImplementation(platform("org.testcontainers:testcontainers-bom:1.20.3"))
testImplementation("org.testcontainers:junit-jupiter")
testImplementation("org.testcontainers:postgresql")
}
C Spring Boot 3.1 контейнер можно подключить одной аннотацией без ручного прописывания spring.datasource.*.
@Testcontainers
@ExtendWith(SpringExtension.class)
@SpringBootTest
class PostgresIT {
@Container
@ServiceConnection // Spring сам подставит URL/логин/пароль в DataSource
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:16-alpine")
.withDatabaseName("app")
.withUsername("app")
.withPassword("secret");
@Test
void contextLoads() {
// проверяем, что контекст и datasource поднялись на контейнере
}
}
Положите миграции в src/test/resources/db/migration (отдельно от продовых — удобно для фикстур):
src/
└─ test/
└─ resources/
└─ db/
└─ migration/
├─ V1__init.sql
└─ V2__seed.sql
▪️ Reusable containers (кэшируемый демон): добавьте в ~/.testcontainers.properties
testcontainers.reuse.enable=true
и .withReuse(true) для контейнера в тесте.
▪️ Singleton-паттерн контейнера: вынесите контейнер в общий абстрактный класс теста, чтобы один контейнер работал на все тесты.
— Если на MacOS/Colima, проверьте доступность Docker API (docker info) перед тестами.
— Для детерминизма фиксируйте теги образов (например, postgres:16-alpine), не latest.
— Логи контейнеров доступны: postgres.followOutput(...) — удобно для диагностики нестабильных тестов.
— Если нужен R2DBC: поднимайте Postgres как выше, а в application-test.yml указывайте r2dbc URL; @ServiceConnection корректно сконфигурирует оба коннектора, если они в classpath.
— Тяжёлые фикстуры → создавайте через SQL-маски (V*_seed.sql) или @Sql прямо в тестах — не смешивайте тестовые данные с продовыми миграциями.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3❤2
Чтобы вам было проще ориентироваться в постах, мы разделили весь контент по 4 основным направлениям:
🔹 #CoreJava — фундаментальные знания: JVM, JDK, ООП, многопоточность, паттерны и базовые концепции. Всё, что помогает понимать Java глубже, а не просто «писать код, чтобы работало».
🔹 #Enterprise — прикладные инструменты и практика: Spring, Hibernate, Kafka, Docker, микросервисы. Всё, что встречается в работе разработчика каждый день.
🔹 #DevLife — сообщество и карьера: мемы, холивары, задачи с собесов, советы по развитию и личные рубрики. Всё, что создаёт атмосферу и объединяет нас как комьюнити.
🔹 #News — дайджесты, свежие анонсы, релизы и новости. А также реклама и инфоповоды, которые стоит знать.
👉 Используйте теги, чтобы быстро находить посты по интересующей теме.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3👏1
Byteman — это фреймворк для «инъекций» в байткод во время выполнения. Он позволяет менять поведение Java-программ без пересборки и изменения исходного кода.
— Правила-инъекции на DSL (можно подмешать логику в любой метод).
— Удобен для тестирования сложных сценариев (например, эмуляция исключений или задержек).
— Поддержка динамической подгрузки/удаления правил без перезапуска приложения.
— Используется для отладки, тестирования отказоустойчивости и профилирования.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3⚡1
✅ Чек-лист по Spring Boot профилям
Чтобы не путаться в окружениях и не тащить dev в прод 🚨 — держите компактный список best practices.
Карточка для сохранения👆🏻
🐸 Библиотека джависта
#Enterprise
Чтобы не путаться в окружениях и не тащить dev в прод 🚨 — держите компактный список best practices.
Карточка для сохранения👆🏻
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥3❤1👾1
Spring Boot из коробки интегрируется с Micrometer, позволяя собирать метрики и отправлять их в Prometheus, Grafana или другие системы мониторинга. Чтобы быстро поднять стек наблюдаемости — подключаем AI.
📝 Промпт:
Generate an observability integration for a Spring Boot 3 application using Micrometer and Prometheus.
— Enable Micrometer metrics in a Spring Boot application.
— Configure PrometheusMeterRegistry for collecting application metrics.
— Expose /actuator/prometheus endpoint for Prometheus scraping.
— Add custom application metrics using MeterRegistry (timers, counters, gauges).
— Configure histograms for REST API response times.
— Integrate Micrometer with Logback for unified metrics and logging.
— Enable health checks with Spring Boot Actuator (disk space, DB, cache).
— Set up Grafana dashboards for visualizing metrics and alerts.
— Добавьте
Enable Distributed Tracing with OpenTelemetry
для отслеживания запросов в распределённых системах.— Добавьте
Configure Grafana Alertmanager integration
для настройки алертов и уведомлений.— Добавьте
Implement custom business metrics (e.g. orders per minute)
для отслеживания доменных метрик приложения.#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2❤1
🎯 IntelliJ IDEA: Bookmarks и Context Bookmarks
Большие проекты → десятки файлов → сотни классов. Иногда нужно быстро вернуться к «тем самым» местам в коде. В ход идут Bookmarks — и особенно Context Bookmarks.
🔹 Что делает
— Позволяет отмечать строки или файлы как закладки
— Поддерживает нумерацию (быстрый переход по цифре)
— Context Bookmarks автоматически привязывают закладки к рабочему контексту (ветке, задаче)
🔹 Зачем это нужно
— Удобно при отладке: отмечаете подозрительные места и прыгаете между ними
— Можно держать список TODO прямо в коде, без комментариев
— Context Bookmarks запоминают, что именно важно для текущей задачи, и не мешают в будущем
🔹 Как использовать
— Обычная закладка: F11 (Windows/Linux) или F3 (macOS)
— Закладка с номером: Ctrl+Shift+<цифра> (Windows/Linux) или ⌘⇧<цифра> (macOS)
— Быстрый переход: Ctrl+<цифра>
— Context Bookmarks: активируются в View → Tool Windows → Bookmarks
🐸 Библиотека джависта
#Enterprise
Большие проекты → десятки файлов → сотни классов. Иногда нужно быстро вернуться к «тем самым» местам в коде. В ход идут Bookmarks — и особенно Context Bookmarks.
🔹 Что делает
— Позволяет отмечать строки или файлы как закладки
— Поддерживает нумерацию (быстрый переход по цифре)
— Context Bookmarks автоматически привязывают закладки к рабочему контексту (ветке, задаче)
🔹 Зачем это нужно
— Удобно при отладке: отмечаете подозрительные места и прыгаете между ними
— Можно держать список TODO прямо в коде, без комментариев
— Context Bookmarks запоминают, что именно важно для текущей задачи, и не мешают в будущем
🔹 Как использовать
— Обычная закладка: F11 (Windows/Linux) или F3 (macOS)
— Закладка с номером: Ctrl+Shift+<цифра> (Windows/Linux) или ⌘⇧<цифра> (macOS)
— Быстрый переход: Ctrl+<цифра>
— Context Bookmarks: активируются в View → Tool Windows → Bookmarks
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2👏1
🎯 Spring Boot + Docker Compose: пошаговая интеграция
В проде редко гоняют приложения напрямую — почти всегда через Docker. А с появлением spring-boot-docker-compose интеграция стала проще: можно поднимать всю инфраструктуру (Postgres, Redis, Kafka и т.д.) одной командой вместе с приложением.
1️⃣ Подготовка зависимостей
В Spring Boot 3.1 добавили официальный стартер:
2️⃣ docker-compose.yml
Определим инфраструктуру (например, Postgres + pgAdmin):
3️⃣ Автоматическая интеграция
Spring Boot сам подтянет конфигурацию из docker-compose.yml. Просто укажите профиль:
или
При старте Boot поднимет контейнеры и подставит spring.datasource.url, username, password.
4️⃣ Кастомизация application-compose.yml
Если нужны дополнительные параметры — кладём их в src/main/resources/application-compose.yml:
5️⃣ Полезные приёмы
— Фиксируйте версии образов, а не latest (для воспроизводимости).
— Healthcheck в docker-compose.yml помогает Boot ждать готовности контейнера.
— Можно запускать docker compose up -d руками, если не хотите, чтобы Boot сам управлял контейнерами.
— Для CI/CD обычно используют отдельные docker-compose.override.yml или Helm чарты, но для дев-окружения spring-boot-docker-compose очень экономит время.
Ставьте 👍🏼, если нужен более подробный пост про настройку docker-compose.yml
🐸 Библиотека джависта
#Enterprise
В проде редко гоняют приложения напрямую — почти всегда через Docker. А с появлением spring-boot-docker-compose интеграция стала проще: можно поднимать всю инфраструктуру (Postgres, Redis, Kafka и т.д.) одной командой вместе с приложением.
В Spring Boot 3.1 добавили официальный стартер:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
</dependency>
ИЛИ
dependencies {
runtimeOnly("org.springframework.boot:spring-boot-docker-compose")
}
Определим инфраструктуру (например, Postgres + pgAdmin):
version: '3.8'
services:
postgres:
image: postgres:16-alpine
container_name: app-postgres
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
pgadmin:
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: [email protected]
PGADMIN_DEFAULT_PASSWORD: secret
ports:
- "8081:80"
depends_on:
- postgres
volumes:
postgres_data:
Spring Boot сам подтянет конфигурацию из docker-compose.yml. Просто укажите профиль:
./mvnw spring-boot:run -Dspring.profiles.active=compose
или
./gradlew bootRun --args='--spring.profiles.active=compose'
При старте Boot поднимет контейнеры и подставит spring.datasource.url, username, password.
Если нужны дополнительные параметры — кладём их в src/main/resources/application-compose.yml:
spring:
datasource:
hikari:
maximum-pool-size: 5
— Фиксируйте версии образов, а не latest (для воспроизводимости).
— Healthcheck в docker-compose.yml помогает Boot ждать готовности контейнера.
— Можно запускать docker compose up -d руками, если не хотите, чтобы Boot сам управлял контейнерами.
— Для CI/CD обычно используют отдельные docker-compose.override.yml или Helm чарты, но для дев-окружения spring-boot-docker-compose очень экономит время.
Ставьте 👍🏼, если нужен более подробный пост про настройку docker-compose.yml
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥1👏1
🛡 Role-Based Access Control (RBAC) в Spring Security
В корпоративных системах управление доступом часто становится узким местом — особенно когда речь идёт о гибкой настройке ролей и разрешений. Вместо ручного «if-else администрирования» можно подключить AI и быстро нагенерировать полноценный слой RBAC.
📝 Промпт:
💡 Расширения:
— Добавьте
— Добавьте
— Добавьте
🐸 Библиотека джависта
#Enterprise
В корпоративных системах управление доступом часто становится узким местом — особенно когда речь идёт о гибкой настройке ролей и разрешений. Вместо ручного «if-else администрирования» можно подключить AI и быстро нагенерировать полноценный слой RBAC.
📝 Промпт:
Generate a Spring Security configuration for a Spring Boot 3 application with Role-Based Access Control (RBAC).
— Configure Spring Security with role-based access (ADMIN, USER, MANAGER).
— Implement method-level security with @PreAuthorize and SpEL expressions.
— Set up JWT authentication with custom claims (roles, permissions).
— Create a PermissionEvaluator for fine-grained access checks (e.g. entity-level access).
— Integrate with a database-backed UserDetailsService for dynamic role management.
— Add an admin API endpoint for managing roles and permissions at runtime.
— Ensure audit logging of access control decisions.
— Добавьте
Multi-tenancy support with tenant-aware role resolution
.— Добавьте
Attribute-Based Access Control (ABAC)
для сложных бизнес-правил.— Добавьте
Integration with Keycloak или OAuth2 provider
для централизованного управления доступом.#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1👏1
Когда код становится сложнее, простого Find Usages уже мало. Хотите понять, откуда пришло значение переменной или куда оно утекает? Для этого есть Analyze Data Flow.
🔹 Что делает
— Позволяет проследить поток данных: где переменная инициализируется, как модифицируется и где используется
— Работает не только для переменных, но и для параметров методов, полей и возвращаемых значений
— Может анализировать как «куда идёт», так и «откуда пришло» (Forward/Backward analysis)
🔹 Зачем это нужно
— Быстро понять, почему метод получает null (и где он берётся)
— Выявить неочевидные зависимости между частями кода
— Ускорить отладку без бесконечного «шагания» по дебаггеру
🔹 Как использовать
— Выделите переменную или метод
— Analyze → Data Flow to Here / Data Flow from Here
— IDEA визуально покажет дерево зависимостей
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3👏2❤1
Тут собраны самые популярные и эффективные инструменты для разных направлений: IDE, ИИ, безопасность и многое другое.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2❤1
🔥 Spring Security: как работает @PreAuthorize и зачем он нужен
В продакшн-коде часто возникает задача ограничить доступ к методам сервиса или контроллера. Делать это вручную — значит плодить дублирование и путать бизнес-логику с проверками. Для этого в Spring Security есть аннотация @PreAuthorize.
🔵 Как это работает
1. Аннотация вешается на метод (контроллер или сервис).
2. При вызове метода Spring Security перехватывает обращение и проверяет условие, указанное в аннотации.
3. Условие описывается на языке SpEL (Spring Expression Language), где доступно:
▪️ authentication — текущий объект аутентификации;
▪️ principal — данные текущего пользователя;
▪️ #id, #dto и т.д. — аргументы метода, к которым можно обратиться напрямую.
Пример:
→ метод вызовется только для пользователей с ролью ADMIN.
🔵 Что можно писать внутри
— Проверка ролей и прав
— Собственные условия
→ Здесь доступ только к своему профилю.
— Комбинации условий
Логика пишется прямо в SpEL:
— Сервисы внутри выражений
В выражение можно подключать свои бины:
→ бин reviewSecurity должен быть в контексте Spring и возвращать true/false.
🔵 Зачем это нужно
— Не надо вручную писать проверки в каждом методе.
— Авторизация централизована и читается прямо на уровне API.
— Условия можно вынести в отдельный сервис, чтобы не захламлять аннотацию.
👉 В итоге @PreAuthorize — это не только про роли, а про гибкий DSL проверки доступа, который можно расширять под проект: от банальной проверки ролей до бизнес-логики уровня "пользователь может редактировать только свои документы, если они ещё не опубликованы".
🐸 Библиотека джависта
#Enterprise
В продакшн-коде часто возникает задача ограничить доступ к методам сервиса или контроллера. Делать это вручную — значит плодить дублирование и путать бизнес-логику с проверками. Для этого в Spring Security есть аннотация @PreAuthorize.
1. Аннотация вешается на метод (контроллер или сервис).
2. При вызове метода Spring Security перехватывает обращение и проверяет условие, указанное в аннотации.
3. Условие описывается на языке SpEL (Spring Expression Language), где доступно:
▪️ authentication — текущий объект аутентификации;
▪️ principal — данные текущего пользователя;
▪️ #id, #dto и т.д. — аргументы метода, к которым можно обратиться напрямую.
Пример:
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) { ... }
→ метод вызовется только для пользователей с ролью ADMIN.
— Проверка ролей и прав
hasRole('USER'), hasAnyRole('ADMIN','MODERATOR')
hasAuthority('SCOPE_read') (актуально при работе с OAuth2)
— Собственные условия
@PreAuthorize("#id == authentication.principal.id")
public UserProfile getProfile(Long id) { ... }
→ Здесь доступ только к своему профилю.
— Комбинации условий
Логика пишется прямо в SpEL:
@PreAuthorize("hasRole('ADMIN') or @securityService.isOwner(#docId)")
public Document update(Long docId) { ... }
— Сервисы внутри выражений
В выражение можно подключать свои бины:
@PreAuthorize("@reviewSecurity.isOwner(#id, authentication)")
public Review update(Long id) { ... }
→ бин reviewSecurity должен быть в контексте Spring и возвращать true/false.
— Не надо вручную писать проверки в каждом методе.
— Авторизация централизована и читается прямо на уровне API.
— Условия можно вынести в отдельный сервис, чтобы не захламлять аннотацию.
👉 В итоге @PreAuthorize — это не только про роли, а про гибкий DSL проверки доступа, который можно расширять под проект: от банальной проверки ролей до бизнес-логики уровня "пользователь может редактировать только свои документы, если они ещё не опубликованы".
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3🔥1
Производительность enterprise-систем часто упирается в кэширование. Но один только Redis — не всегда оптимально: сетевые вызовы вносят задержки, а локальные кэши не делятся данными между инстансами. Решение — связка in-memory и распределённого кэша.
📝 Промпт:
Generate a Spring Boot 3 configuration with multi-level caching (L1 + L2).
— Integrate Caffeine as in-memory (L1) cache for ultra-fast lookups.
— Integrate Redis as distributed (L2) cache for cross-instance consistency.
— Configure CacheManager that combines Caffeine (short-lived) and Redis (longer TTL) transparently.
— Implement annotation-based caching with @Cacheable, @CachePut, and @CacheEvict.
— Add fallback to DB if both caches miss, with metrics for hit/miss ratios.
— Ensure proper serialization (Jackson or Kryo) for complex entities in Redis.
— Provide cache invalidation strategies (per entity, per tenant, global).
— Добавьте Near-cache pattern для высоконагруженных сервисов.
— Интегрируйте с Spring Data Redis Streams для event-driven invalidation.
— Настройте Prometheus + Grafana dashboards для мониторинга кэш-слоя.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2❤1👏1