From 688c47a6f623a3f09e785c03add52a175d5dfbfc Mon Sep 17 00:00:00 2001 From: "shengzhaoli.shengz" Date: Wed, 28 May 2025 17:46:38 +0800 Subject: [PATCH] Redis jti repository impl/ test --- pom.xml | 4 + .../oauth/ClaimsOAuth2TokenCustomizer.java | 3 +- .../sos/domain/oauth/JtiRepository.java | 44 +++++++++ .../monkeyk/sos/domain/oauth/JtiToken.java | 73 ++++++++++++++ .../redis/JtiRepositoryRedis.java | 96 +++++++++++++++++++ src/main/resources/application.properties | 3 +- .../redis/JtiRepositoryRedisTest.java | 48 ++++++++++ 7 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/monkeyk/sos/domain/oauth/JtiRepository.java create mode 100644 src/main/java/com/monkeyk/sos/domain/oauth/JtiToken.java create mode 100644 src/main/java/com/monkeyk/sos/infrastructure/redis/JtiRepositoryRedis.java create mode 100644 src/test/java/com/monkeyk/sos/infrastructure/redis/JtiRepositoryRedisTest.java diff --git a/pom.xml b/pom.xml index 1a4dd54..ec7c06d 100644 --- a/pom.xml +++ b/pom.xml @@ -65,6 +65,10 @@ org.springframework.boot spring-boot-starter-data-redis + + org.apache.commons + commons-pool2 + diff --git a/src/main/java/com/monkeyk/sos/domain/oauth/ClaimsOAuth2TokenCustomizer.java b/src/main/java/com/monkeyk/sos/domain/oauth/ClaimsOAuth2TokenCustomizer.java index f7c4030..f3e4c04 100644 --- a/src/main/java/com/monkeyk/sos/domain/oauth/ClaimsOAuth2TokenCustomizer.java +++ b/src/main/java/com/monkeyk/sos/domain/oauth/ClaimsOAuth2TokenCustomizer.java @@ -39,7 +39,8 @@ public class ClaimsOAuth2TokenCustomizer implements OAuth2TokenCustomizer redisTemplate; + + + /** + * 统一加前缀 + * + * @param jti jti + * @return redis key + */ + private String getJtiRedisKey(String jti) { + return String.format(KEY_FORMAT, jti); + } + + + /** + * {@inheritDoc} + */ + @Override + public void saveJtiToken(JtiToken jtiToken, long ttl) { + if (ttl <= 0) { + throw new IllegalArgumentException("ttl must be greater than 0"); + } + String redisKey = getJtiRedisKey(jtiToken.getJti()); + if (LOG.isTraceEnabled()) { + LOG.trace("saveJtiToken, jtiToken: {}, ttl: {}", jtiToken, ttl); + } + BoundValueOperations bvo = this.redisTemplate.boundValueOps(redisKey); + bvo.set(jtiToken, ttl, TimeUnit.SECONDS); + } + + + /** + * {@inheritDoc} + */ + @Override + public JtiToken findByJti(String jti) { + String redisKey = getJtiRedisKey(jti); + BoundValueOperations bvo = this.redisTemplate.boundValueOps(redisKey); + return (JtiToken) bvo.get(); + } + + + /** + * {@inheritDoc} + */ + @Override + public boolean existJti(String jti) { + String redisKey = getJtiRedisKey(jti); + Boolean has = this.redisTemplate.hasKey(redisKey); + return has != null ? has : false; + } + + + /** + * {@inheritDoc} + */ + @Override + public Boolean removeJtiToken(String jti) { + String redisKey = getJtiRedisKey(jti); + return this.redisTemplate.delete(redisKey); + } + + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d1689fc..ef72b75 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -24,11 +24,12 @@ spring.security.oauth2.authorizationserver.issuer=http://127.0.0.1:${server.port # # Redis # -spring.data.redis.host=localhost +spring.data.redis.host=127.0.0.1 spring.data.redis.port=6379 spring.data.redis.database=5 spring.data.redis.password= spring.data.redis.timeout=2000 +spring.data.redis.lettuce.pool.enabled=true # # Condition Config # @since 2.1.0 diff --git a/src/test/java/com/monkeyk/sos/infrastructure/redis/JtiRepositoryRedisTest.java b/src/test/java/com/monkeyk/sos/infrastructure/redis/JtiRepositoryRedisTest.java new file mode 100644 index 0000000..f6e4989 --- /dev/null +++ b/src/test/java/com/monkeyk/sos/infrastructure/redis/JtiRepositoryRedisTest.java @@ -0,0 +1,48 @@ +package com.monkeyk.sos.infrastructure.redis; + +import com.monkeyk.sos.domain.oauth.JtiToken; +import com.monkeyk.sos.infrastructure.AbstractRepositoryTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * 2025/5/28 17:33 + * + * @author Shengzhao Li + * @since 3.0.1 + */ +//@Transactional +class JtiRepositoryRedisTest extends AbstractRepositoryTest { + + + @Autowired + private JtiRepositoryRedis repositoryRedis; + + @Test + void saveJtiToken() { + + JtiToken jtiToken = new JtiToken() + .setJti("jti").setClientId("clientId").setUserId("userId"); + + repositoryRedis.saveJtiToken(jtiToken, 1000); + + repositoryRedis.removeJtiToken(jtiToken.getJti()); + } + + @Test + void findByJti() { + + JtiToken jtiToken = repositoryRedis.findByJti("jti"); + assertNull(jtiToken); + } + + @Test + void existJti() { + + boolean exist = repositoryRedis.existJti("jti"); + assertFalse(exist); + } +} \ No newline at end of file