Адаптер Shiro для Redis, созданный как централизованное решение для кэширования вместо непригодного для использования в кластере Shiro-Ehcache.
<dependency>
<groupId>org.iherus.shiro</groupId>
<artifactId>shiro-redis</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.iherus.shiro</groupId>
<artifactId>shiro-redis-spring-boot-web-starter</artifactId>
<version>2.5.0</version>
</dependency>
v2.5.0:
Изменение журнала:
v2.4.0: [содержит ошибки, игнорируйте этот выпуск]
Обычное исправление багов версия
v2.3.0:
Изменение журнала:
v2.2.0:
Изменение журнала:
v2.1.0:
Изменение журнала:
Изменение журнала:
[main]
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName=MD5
credentialsMatcher.hashIterations=2
poolConfig=redis.clients.jedis.JedisPoolConfig poolConfig.minIdle=3 poolConfig.maxIdle=10 poolConfig.maxWaitMillis=1500 poolConfig.maxTotal=100
configuration=org.iherus.shiro.cache.redis.config.RedisStandaloneConfiguration configuration.host=127.0.0.1 configuration.port=6379 configuration.database=2 #configuration.password=
#configuration=org.iherus.shiro.cache.redis.config.RedisSentinelConfiguration #configuration.masterName=mymaster #configuration.sentinelsFromText=127.0.0.1:56379,127.0.0.1:56479,127.0.0.1:56579 #configuration.database=2 #configuration.password=
#configuration=org.iherus.shiro.cache.redis.config.RedisClusterConfiguration #configuration.clusterNodesFromText=127.0.0.1:16379,127.0.0.1:16380,127.0.0.1:16381,127.0.0.1:16382,127.0.0.1:16383,127.0.0.1:16384 #configuration.password=
connectionFactory=org.iherus.shiro.cache.redis.connection.jedis.JedisConnectionFactory connectionFactory.poolConfig=$poolConfig connectionFactory.configuration=$configuration #connectionFactory.clientName= #connectionFactory.connectTimeoutMillis= #connectionFactory.soTimeoutMillis=
#connectionFactory=org.iherus.shiro.cache.redis.connection.lettuce.LettuceConnectionFactory #connectionFactory.poolConfig=$poolConfig #connectionFactory.configuration=$configuration #connectionFactory.clientName= #connectionFactory.timeoutMillis=
#connectionFactory=org.iherus.shiro.cache.redis.connection.redisson.RedissonConnectionFactory #connectionFactory.configuration=$configuration #connectionFactory.clientName= #connectionFactory.connectTimeoutMillis= #connectionFactory.soTimeoutMillis=
cacheManager=org.iherus.shiro.cache.redis.RedisCacheManager
cacheManager.connectionFactory=$connectionFactory
cacheManager.expirationMillis=900000
cacheManager.keyPrefix=shiro:test:cache:
#cacheManager.scanBatchSize=3000
#cacheManager
```
```markdown
deleteBatchSize=5000
#cacheManager.fetchBatchSize=50
#cacheManager.database=5
#Установка реала с помощью CredentialsMatcher
customRealm=org.iherus.shiro.tester.CustomRealm
customRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$customRealm
securityManager.cacheManager=$cacheManager
```**2\. Интеграция Spring**
```xml
<!-- SHIRO安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="userRealm"/>
<property name="cacheManager" ref="cacheManager"/>
<property name="rememberMeManager" ref="rememberMeManager"/>
<property name="sessionManager" ref="sessionManager"/>
</bean>
<!-- Пользовательская область -->
<bean id="userRealm" class="org.iherus.shiro.tester.CustomRealm"/>
<!-- Управление сессиями -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="sessionDAO" ref="sessionDAO"/>
<property name="globalSessionTimeout" value="${shiro.globalSessionTimeout}"/>
<property name="deleteInvalidSessions" value="${shiro.deleteInvalidSessions}"/>
<property name="sessionValidationInterval" value="${shiro.sessionValidationInterval}"/>
</bean>
<!-- Управление сессиями -->
<bean id="sessionDAO" class="org.iherus.shiro.cache.redis.RedisSessionDAO">
<property name="cacheManager" ref="cacheManager"/>
</bean>
<!-- Управление запоминанием входа -->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cookie" ref="rememberMeCookie"/>
</bean>
<!-- Объект cookie -->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<property name="name" value="${shiro.cookieName}"/>
<property name="maxAge" value="${shiro.cookieMaxAge}"/>
</bean>
<!-- Управление кэшем -->
<bean id="cacheManager" class="org.iherus.shiro.cache.redis.RedisCacheManager">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="database" value="2"/>
<property name="expirationMillis" value="90000"/>
<property name="keyPrefix" value="shiro:cache:"/>
</bean>
```Дополнительные тестовые примеры можно найти в `src/test/java/org/iherus/shiro/tester/SimpleCacheTest.java`.
```markdown
<property name="scanBatchSize" value="3000" />
<property name="deleteBatchSize" value="5000" />
<property name="fetchBatchSize" value="50" />
</bean>
<!-- Redis соединение фабрика -->
<bean id="connectionFactory" class="org.iherus.shiro.cache.redis.connection.jedis.JedisConnectionFactory">
<property name="clientName" value="SRC" />
<property name="connectTimeoutMillis" value="3000" />
<property name="soTimeoutMillis" value="2000" />
<property name="poolConfig" ref="poolConfig" />
<property name="configuration" ref="standaloneConfiguration" />
<!-- <property name="configuration" ref="sentinelConfiguration" /> -->
<!-- <property name="configuration" ref="clusterConfiguration" /> -->
</bean>
<!-- Redis одиночное конфигурация -->
<bean id="standaloneConfiguration" class="org.iherus.shiro.cache.redis.config.RedisStandaloneConfiguration">
<property name="host" value="127.0.0.1" />
<property name="port" value="6379" />
<property name="database" value="0" />
<!-- <property name="password" value="" /> -->
</bean>
<!-- Redis сentinels конфигурация -->
<bean id="sentinelConfiguration" class="org.iherus.shiro.cache.redis.config.RedisSentinelConfiguration">
<property name="masterName" value="mymaster" />
<property name="sentinelsFromText" value="127.0.0.1:56379,127.0.0.1:56479,127.0.0.1:56579" />
<!-- <property name="password" value="" /> -->
</bean>
<!-- Redis кластер конфигурация -->
<bean id="clusterConfiguration" class="org.iherus.shiro.cache.redis.config.RedisClusterConfiguration">
<property name="clusterNodesFromText" value="127.0.0.1:16379,127.0.0.1:16380,127.0.0.1:16381..." />
<property name="maxAttempts" value="5" />
<!-- <property name="password" value="" /> -->
</bean>
<!-- Конфигурация пула подключений -->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="minIdle" value="${redis.minIdle}" />
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
``````markdown
maxWaitMillis}" />
<property name="maxTotal" value="${redis.maxTotal}" />
</bean>
```
**3. Интеграция Spring Boot**
3.1) Введение зависимости Spring Boot Starter:
```xml
<dependency>
<groupId>org.iherus.shiro</groupId>
```
```xml
<artifactId>shiro-redis-spring-boot-web-starter</artifactId>
<version>{latestVersion}</version>
</dependency>
```
$\color{red}{\text{Обратите внимание: поскольку клиентские инструменты являются опциональными зависимостями, введите соответствующие зависимости в зависимости от потребностей. Поддерживаемые библиотеки: jedis, lettuce, redisson и spring-data-redis.}}$<br>
$\color{red}{\text{Если вы используете lettuce, вам также потребуется добавить commons-pool2.}}$
3.2) По умолчанию, shiro-redis-spring-boot-web-starter автоматически создает экземпляры RedisCacheManager и RedisSessionDAO и внедряет их в WebSecurityManager и WebSessionManager соответственно. Если вам требуется настроить SecurityManager и SessionManager, это можно сделать следующим образом:
```java
@Bean
public SessionManager sessionManager(SessionDAO sessionDAO) {
DefaultWebSessionManager webSessionManager = new DefaultWebSessionManager();
// Внедрение экземпляра RedisSessionDAO
webSessionManager.setSessionDAO(sessionDAO);
...
return webSessionManager;
}
```
``````markdown
### 3-3) Настройка SSL, предоставляются интерфейсы: `JedisSslClientConfigurationCustomizer`, `LettuceClientConfigurationCustomizer`, `RedissonSslClientConfigurationCustomizer`. Вы можете реализовать эти конфигураторы и зарегистрировать их как Bean.
```java
@Bean
public JedisSslClientConfigurationCustomizer JedisSslClientConfigurationCustomizer() {
return ((builder) -> {
// SSL конфигурация...
});
}
```
### 3-4) Конфигурационные свойства
| Атрибут | Значение по умолчанию | Описание |
| --- | --- | --- |
| **Основные настройки** |
| `shiro.redis.host` | `localhost` | Хост |
| `shiro.redis.port` | `6379` | Порт |
| `shiro.redis.database` | `0` | База данных |
| `shiro.redis.password` | | Пароль |
| `shiro.redis.sentinel.master-name` | | Имя мастера при использовании режима Sentinel |
| `shiro.redis.cluster.max-attempts` | `5` | Максимальное количество попыток |
| `shiro.redis.cluster.nodes` | | Адреса узлов в кластере, разделенные запятой, пример: `127.0.0.1:16379,127.0.0.1:16380,127.0.0.1:16381...` |
| **Jedis** |
| `shiro.redis.jedis.client-name` | | Имя клиента |
| `shiro.redis.jedis.connect-timeout` | `2000ms` | Время соединения |
| `shiro.redis.jedis.so-timeout` | `2000ms` | Время чтения |
| `shiro.redis.jedis.ssl` | `false` | Включен ли SSL? |
```redis.jedis.pool.minIdle | 3 ||
||
shiro.redis.jedis.pool.maxIdle | 8 ||
||
shiro.redis.jedis.pool.maxTotal | 8 ||
||
shiro.redis.jedis.pool.maxWaitMillis | 90000 ||
||
shiro.redis.jedis.pool.minEvictableIdleTimeMillis | 60000 ||
||
shiro.redis.jedis.pool.testOnBorrow | false ||
||
shiro.redis.jedis.pool.testWhileIdle | true ||
||
shiro.redis.jedis.pool.timeBetweenEvictionRunsMillis | 30000 ||
||
shiro.redis.jedis.pool.numTestsPerEvictionRun | -1 ||
|**Lettuce**|
||
shiro.redis.lettuce.clientName | имя клиента|
||
shiro.redis.lettuce.readFrom | предпочитаемый узел для операций чтения|
||
shiro.redis.lettuce.ssl | false | включено ли SSL? |
||
shiro.redis.lettuce.verifyPeer | true | включена ли проверка сертификата SSL? |
||
shiro.redis.lettuce.startTls | false | включено ли StartTLS? |
||
shiro.redis.lettuce.pool.minIdle | 3 ||
||
shiro.redis.lettuce.pool.maxIdle | 8 ||
||
shiro.redis.lettuce.pool.maxTotal | 8 ||
||
shiro.redis.lettuce.pool.maxWaitMillis | 90000 ||
||
shiro.redis.lettuce.pool.minEvictableIdleTimeMillis | 60000 ||
||
shiro.redis.lettuce.pool.testOnBorrow | false ||
||
shiro.redis.lettuce.pool.testWhileIdle | true ||
||
shiro.redis.lettuce.pool.timeBetweenEvictionRunsMillis | 30000 ||
||
shiro.redis.lettuce.pool.numTestsPerEvictionRun | -1 ||
|**Redisson**|
||
shiro.redis.redisson.clientName | имя клиента|
||
shiro.redis.redisson.connectTimeout | 10000ms | время соединения|
||
shiro.redis.redisson.connectionMinIdleSize | 8 | минимальное количество пустых соединений|
||
shiro.redis.redisson.connectionPoolSize | 32 | размер пула соединений|
||
shiro.redis.redisson.soTimeout | 3000ms | время чтения|
||
shiro.redis.redisson.ssl | false | включено ли SSL? |
|**Конфигурация кэша Shiro**|
||
shiro.redis.cache.batchOptions.deleteBatchSize | 5000 | количество объектов для одновременного удаления|
||
shiro.redis.cache.batchOptions.fetchBatchSize | 50 | количество за один раз получаемых данных|```markdown
scan-batch-size | 3000 | Количество записей, сканируемых за один раз |
shiro.redis.cache.database | 0 | База данных для кэша Shiro |
shiro.redis.cache.expiration | PT15M | Время жизни кэша Shiro |
shiro.redis.cache.key-prefix | shiro:cache: | Префикс ключей кэша Shiro |
## Особое примечание относительно ключей кэша
Для ключей кэша, отличных от типов `byte[]` и `String`, используется стратегия генерации MD5 как ключа. Это требует, чтобы объект `[PrincipalCollection principals]`, возвращенный методом `AuthorizingRealm#doGetAuthenticationInfo`, был постоянным. Таким образом, если требуется динамическое изменение свойств `principals`, это приведет к изменению ключей кэша.
Поэтому рекомендуется переопределить эти два метода для решения этой проблемы:
1. AuthorizingRealm #getAuthorizationCacheKey(PrincipalCollection principals)
2. AuthorizingRealm #getAuthenticationCacheKey(PrincipalCollection principals)
Пример:
```
/**
* Рекомендуется переопределить этот метод для предоставления уникального ключа кэша
*/
@Override
protected Object getAuthorizationCacheKey(PrincipalCollection principals) {
return this.getAuthenticationCacheKey(principals);
}
/**
* Рекомендуется переопределить этот метод для предоставления уникального ключа кэша
*/
@SuppressWarnings("unchecked")
@Override
protected Object getAuthenticationCacheKey(PrincipalCollection principals) {
StringBuilder sb = new StringBuilder();
principals.forEach(principal -> {
sb.append(((User) principal).getId());
});
return sb.toString();
}
```
Дополнительная информация будет добавлена позже. :smile:
## Особенности
Мы рады принять ваши предложения для улучшения shiro-redis
```
**Авторское право**
Лицензия Apache, версия 2.0
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )