Redis使用Predixy代理 解决ERR auth permission deny

Predixy完美的实现了对redis单例模式及集群模式的支持,几乎完整的实现了redis原生的所有用于客户端的命令。多key命令、列表阻塞操作、发布订阅、脚本、扫描等高级功能全支持,在使用redis单例模式下也支持事物。

简单来说 Predixy代理redis优点很多,但是因为安全性的原因Predixy会禁用一些redis的命令,比如:


禁用config命令

当你的服务启动时或者运行时使用了redis以上命令,就会抛出以下异常:

Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]:Invocation of init method failed; nested exception is java.lang.IllegalStateException: Unable to configure Redis to keyspace notifications.See http://docs.spring.io/spring-session/docs/current/reference/html5/#api-redisoperationssessionrepository-sessiondestroyedeventCaused by: redis.clients.jedis.exceptions.JedisDataException: ERR unknown command config

如果redis不使用Predixy代理时,遇到此问题只需要在redis服务命令行中执行

redis-cli configsetnotify-keyspace-events Egx

即可解决。

但使用了Predixy代理时,再设置服务端就自相矛盾了,那只能想办法让spring session不再执行config命令,解决办法:需要在Spring配置文件中加上一个配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">

    <property name="hostName" value="localhost" />

    <property name="password" value="your-password" />

    <property name="port" value="6379" />

    <property name="database" value="10" />

</bean>

<!-- 让Spring Session不再执行config命令 -->

<util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>

</beans>

这时有的同学就开始骂娘了,我们现在都使用springboot了,没人配置spring的配置文件了,都使用spring bean容器托管了,那该怎么在代码中实现呢?

那我们就把这个constant放到bean中去托管

@Configuration

public class RedisHttpSessionConfiguration{

    @Bean

    public ConfigureRedisAction getConfigureRedisAction (){ return ConfigureRedisAction.NO_OP}

    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容