1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/BYSRepo-shiro-redis

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 18 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 16.03.2025 18:48 5543235

! аватар Shiro-Redis

Адаптер Shiro для Redis, созданный как централизованное решение для кэширования вместо непригодного для использования в кластере Shiro-Ehcache.

Лицензия Maven Central

Maven координаты

<dependency>
    <groupId>org.iherus.shiro</groupId>
    <artifactId>shiro-redis</artifactId>
    <version>2.5.0</version>
</dependency>

Spring Boot

<dependency>
    <groupId>org.iherus.shiro</groupId>
    <artifactId>shiro-redis-spring-boot-web-starter</artifactId>
    <version>2.5.0</version>
</dependency>

Обновление лога

v2.5.0:
Изменение журнала:

  1. Устранены проблемы: #I1YUFN, #I2BSCN, #I2B7LC, #I22K17, #I26UHZ.
  2. Поддержка сессий, которые никогда не истощаются, #I2BCKL.

v2.4.0: [содержит ошибки, игнорируйте этот выпуск]
Обычное исправление багов версия

v2.3.0:
Изменение журнала:

  1. Устранена проблема RedisSessionDAO#uncache метода выбрасывания StackOverflowError. Проблемы: #I1TIIG.
  2. Обновлены зависимости, среди которых версия Shiro была повышена до 1.6.0.

v2.2.0:
Изменение журнала:

  1. Добавлена стратегия области действия.

v2.1.0:
Изменение журнала:

  1. Исправлены баги.
  2. Улучшена совместимость.
  3. Выпущен shiro-redis-spring-boot-web-starter.v2.0.0:
    Примечание:
    Этот выпуск является переопределенной версией, API которой несовместимы с v1.x.

Изменение журнала:

  1. В версии v1.x поддерживаются только одиночные режимы; добавлена поддержка режимов Sentinel (Sentinels) и Cluster (Кластеры).
  2. Поддерживается клиент Lettuce и Redisson.
  3. Совместимость с Spring-data-redis.
  4. Для режима без кластера можно установить отдельную базу данных.
  5. Поддержка установки времени жизни кэша.
  6. Оптимизация производительности.
  7. Добавлен RedisSessionDAO для снижения частоты запросов к Redis.

Указания по использованию Shiro-Redis

1. Использование с конфигурацией ini```markdown

[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

Определение конфигурации подключения

Standalone

configuration=org.iherus.shiro.cache.redis.config.RedisStandaloneConfiguration configuration.host=127.0.0.1 configuration.port=6379 configuration.database=2 #configuration.password=

Sentinel

#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=

Cluster

#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=

Определение фабрики соединений

Jedis

connectionFactory=org.iherus.shiro.cache.redis.connection.jedis.JedisConnectionFactory connectionFactory.poolConfig=$poolConfig connectionFactory.configuration=$configuration #connectionFactory.clientName= #connectionFactory.connectTimeoutMillis= #connectionFactory.soTimeoutMillis=

Lettuce

#connectionFactory=org.iherus.shiro.cache.redis.connection.lettuce.LettuceConnectionFactory #connectionFactory.poolConfig=$poolConfig #connectionFactory.configuration=$configuration #connectionFactory.clientName= #connectionFactory.timeoutMillis=

Redisson

#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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/BYSRepo-shiro-redis.git
git@api.gitlife.ru:oschina-mirror/BYSRepo-shiro-redis.git
oschina-mirror
BYSRepo-shiro-redis
BYSRepo-shiro-redis
master