Command Palette

Search for a command to run...

Blog

[Advanced Spring Boot] Tự dựng authorization server: Spring Authorization Server và Keycloak

Dựng một authorization server OAuth2 và OpenID Connect bằng Spring Authorization Server, nay là một module của Spring Security, trên Spring Boot 4.1.1: starter mà Initializr chọn và starter đã deprecated, một server chỉ từ property, hai discovery document và các endpoint chúng công bố, hai filter chain Boot đăng ký và những gì thay đổi khi bạn tự khai báo, client_credentials và authorization_code với PKCE từng bước, body lỗi thật, RSA key đổi sau mỗi lần restart, key cố định và key rotation với JWK selector, JWKS cache của resource server, client, authorization và consent lưu bằng JDBC trên PostgreSQL với schema script lấy từ jar, claim roles từ OAuth2TokenCustomizer và cái bẫy allowlist của Jackson, opaque token với introspection được đo so với việc validate JWT, và phép so sánh có đo đạc với Keycloak.

[Advanced Spring Boot] OAuth2 và OpenID Connect trong Spring Boot: OAuth2 Login và resource server với JWT

OAuth2 và OpenID Connect với Spring Security trên Spring Boot 4.1.1 và Keycloak: realm import từ file JSON, discovery qua issuer-uri và lỗi khởi động khi Keycloak tắt, authorization code flow với PKCE (S256, bật sẵn cho confidential client) từng bước một, authorization code bị đánh cắp bị từ chối vì thiếu verifier, ID token và access token giải mã cạnh nhau, OidcUser với các authority OIDC_USER và SCOPE_, user-name-attribute, realm role của Keycloak map thành ROLE_ bằng GrantedAuthoritiesMapper, RP-initiated logout với OidcClientInitiatedLogoutSuccessHandler, Google và GitHub qua CommonOAuth2Provider, resource server JWT với issuer-uri và key được tải lười, header WWW-Authenticate cho token từ realm khác, sai issuer, bị sửa chữ ký, sai audience và hết hạn, realm_access.roles map bằng authorities-claim-expressions, token relay với OAuth2ClientHttpRequestInterceptor và token client credentials dùng lại qua nhiều lần gọi.

[Advanced Spring Boot] Multi-tenancy và soft delete với Spring Boot và Hibernate

Multi-tenancy và soft delete trên Spring Boot 4.1.1 với Hibernate và PostgreSQL: filter đọc X-Tenant-Id với ThreadLocal bị rò rỉ trên thread Tomcat được tái sử dụng và bị mất trên @Async, discriminator column với @TenantId và CurrentTenantIdentifierResolver (predicate tenant trên find, JPQL, derived query, Specification và bulk update, không có trên native SQL hay JdbcClient), schema per tenant với MultiTenantConnectionProvider, bẫy tái sử dụng connection giữa setSchema và SET search_path trên HikariCP, Flyway cho từng tenant schema và TenantSchemaMapper của Hibernate, database per tenant với 100 connection cho mười tenant, row-level security của PostgreSQL với set_config và FORCE, các strategy của @SoftDelete so với @SQLDelete và @SQLRestriction, lỗi to-one LAZY, partial unique index cho SKU đã soft delete, và khôi phục các dòng đã xóa.

[Advanced Spring Boot] NoSQL với Spring Data: MongoDB và Redis

Spring Data MongoDB và Spring Data Redis trên Spring Boot 4.1.1: @Document, id là String hay ObjectId, field _class, embedded hay @DocumentReference cùng các query mỗi cách gửi đi, MongoRepository và MongoTemplate kèm command đã log, $push/$inc so với load-modify-save dưới 50 thread, @Version, Boot có tạo index từ @Indexed không, COLLSCAN và IXSCAN trên 300.000 document, một aggregation pipeline, transaction trên replica set, một field bị đổi tên, serializer của RedisTemplate, INCR, sorted set, hash, TTL, key của @RedisHash và phantom key, pipelining và Lettuce.

[Advanced Spring Boot] Nhiều datasource trong Spring Boot: hai database và định tuyến read/write replica

Nhiều datasource trong Spring Boot 4.1.1 với PostgreSQL: Boot lùi lại những gì khi có hai bean DataSource, DataSourceProperties và bẫy prefix của HikariCP, hai EntityManagerFactory dựng bằng EntityManagerFactoryBuilder, @EnableJpaRepositories và @Transactional(transactionManager), repository chạy dưới transaction manager sai, Flyway cho database thứ hai, vì sao ghi vào hai database không atomic, streaming replica trong Docker, AbstractRoutingDataSource và bug cờ read-only, LazyConnectionDataSourceProxy cùng read-only DataSource có sẵn, SQLSTATE 25006, replication lag và các cách giữ read-your-writes, mỗi đích một connection pool HikariCP.

[Advanced Spring Boot] Caching trong Spring Boot: cache abstraction, Caffeine, Redis và chiến lược invalidation

Caching trong Spring Boot 4.1.1 trên một lookup sản phẩm với PostgreSQL và Redis: vì sao vẫn cần @EnableCaching, @Cacheable, @CachePut, @CacheEvict với allEntries và @Caching, key SimpleKey và SpEL, condition, unless và null từ Optional được cache, LazyInitializationException do cache entity, eviction của Caffeine và metric cache.gets, vì sao Boot chọn Redis thay vì Caffeine, JDK serialization so với GenericJacksonJsonRedisSerializer cho Jackson 3 và type validator từ chối BigDecimal, hai cách cấu hình serializer âm thầm làm mất setting, latency khi không cache, với Caffeine và với Redis, cache stampede mà sync = true không chặn được trên Redis, race evict-trước-commit và transactionAware(), đọc dữ liệu cũ giữa hai instance, và request ra sao khi Redis dừng hoặc treo, có và không có CacheErrorHandler.