Библиотека джависта | Java, Spring, Maven, Hibernate
23.7K subscribers
2.11K photos
43 videos
43 files
2.97K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://t.iss.one/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
🎮 DevTools на каждый день

Тут собраны самые популярные и эффективные инструменты для разных направлений: IDE, ИИ, безопасность и многое другое.

💬 Какие инструменты используете в повседневной работе?

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥21
🔥 Spring Security: как работает @PreAuthorize и зачем он нужен

В продакшн-коде часто возникает задача ограничить доступ к методам сервиса или контроллера. Делать это вручную — значит плодить дублирование и путать бизнес-логику с проверками. Для этого в 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
⚡️ Multi-Level Caching в Spring Boot

Производительность 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🔥21👏1