redis.conf中使用requirepass不生效的原因及解决方法

 更新时间:2023年07月16日 09:52:30   作者:小平杂记  
本文主要介绍了如何启用requirepass,以及启用requirepass为什么不会生效,从代码层面分析了不生效的原因,以及解决方法,需要的朋友可以参考下

requirepass字段介绍

requirepass字段是redis.conf中的一个字段,可以看下redis.conf中的注释

# IMPORTANT NOTE: starting with Redis 6 "requirepass" is just a compatibility
# layer on top of the new ACL system. The option effect will be just setting
# the password for the default user. Clients will still authenticate using
# AUTH <password> as usually, or more explicitly with AUTH default <password>
# if they follow the new protocol: both will work.
#
# The requirepass is not compatable with aclfile option and the ACL LOAD
# command, these will cause requirepass to be ignored.
#
# requirepass foobared

即这个字段是用来设置默认用户default的密码的,用户可以通过auth 或者auth default 来认证,同时说明了不能跟aclfile兼容,如果启动acl,则该字段会被忽略,会使用acl文件中的default用户,如果没有配置default用户,则会新建一个nopass的default用户并使用,哈哈,这就是为什么redis.conf配置了requirepass而不生效的原因,提前说了。

如何启用requirepass

  • 启用redis.conf中的requirepass,改为自己的密码password,同时启用logfile,注意不要启用aclfile,否则会不生效
  • 启动redis-server ./redis.conf
  • redis-cli -h localhost -p 6379访问,发现需要进行认证,输入auth password或者auth default password即可进行访问了,默认登录用户就是default用户
  • default用户的密码就是requirepass配置的密码,在initServer中会调用ACLUpdateDefaultUserPassword(server.requirepass)函数设置default用户的密码

至于为什么启用aclfile时会不生效,请继续看

启用requirepass时requirepass不生效?

现象

requirepass是default用户的密码,配置密码后,aclfile也启用时,修改redis.conf配置后重启redis后,redis-cli -h localhost -p port 无需认证仍然可以访问,即没有生效

看下redis.conf中注释可以知道跟aclfile是不兼容的,启用aclfile时,会忽略requirepass

原因

redis.conf中同时启用requirepass和aclfile,redis在加载配置时,会读取aclfile,重新新建全局Users对象,调用ACLInitDefaultUser函数重新新建nopass的default用户,先前已加载的defaultUser对象(密码从requirepass来)不会被用到,即default用户是nopass的,但是如果acl文件中配置了default用户以及配置了密码,则还是需要认证的

sds ACLLoadFromFile(const char *filename) {
      ...
    /* The default user pointer is referenced in different places: instead
         * of replacing such occurrences it is much simpler to copy the new
         * default user configuration in the old one. */
        user *new_default = ACLGetUserByName("default",7);
        if (!new_default) {
            new_default = ACLCreateDefaultUser();  // nopass的default用户
        }
        ACLCopyUser(DefaultUser,new_default);
        ACLFreeUser(new_default);
        raxInsert(Users,(unsigned char*)"default",7,DefaultUser,NULL);
        raxRemove(old_users,(unsigned char*)"default",7,NULL);
        ACLFreeUsersSet(old_users);
        sdsfree(errors);
        return NULL;
       ...
}

解决方法

  • 不启用aclfile,只使用requirepass,即只有default用户了
  • 启用aclfile,redis-cli登录后,用config set requirepass xxx,会生效,然后重新redis-cli登录访问即可,如果需要重启redis也生效,则进行acl save(会写default的user规则到aclfile中)

注意点:config set requirepass xxx会调用updateRequirePass函数,该函数会继续调用ACLUpdateDefaultUserPassword更新default用户的密码(nopass变为有密码状态),注意redis最新版本(7.0以上)只会在更新的内容发生变化时才会调用到updateRequirePass函数,如下面的sdsConfigSet函数,在内容有变化时才返回1

configSetCommand -> performInterfaceSet -> sdsConfigSet函数

performInterfaceSet会将sdsConfigSet函数返回值作为自己的返回值,

configSetCommand函数判断performInterfaceSet返回值,如果为1,则

会调用到updateRequirePass函数

  • 使用上还是直接使用aclfile即可,将requirepass注释掉,登录后新增用户,然后acl save

总结

本文主要介绍了如何启用requirepass,以及启用requirepass为什么不会生效,从代码层面分析了不生效的原因,是因为同时启用了aclfile导致requirepass中的密码不会被用到,最后介绍了解决方法,建议使用上直接使用aclfile即可。

到此这篇关于redis.conf中使用requirepass不生效的原因及解决方法的文章就介绍到这了,更多相关redis.conf中使用requirepass不生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis中HyperLogLog的使用详情

    Redis中HyperLogLog的使用详情

    这篇文章主要介绍了Redis中HyperLogLog的使用详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 在redisCluster中模糊获取key方式

    在redisCluster中模糊获取key方式

    这篇文章主要介绍了在redisCluster中模糊获取key方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 缓存替换策略及应用(以Redis、InnoDB为例)

    缓存替换策略及应用(以Redis、InnoDB为例)

    本文以Redis、InnoDB为例给大家讲解缓存替换策略及应用,本文给大家提到五种置换策略,通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-07-07
  • redis的hash类型操作方法

    redis的hash类型操作方法

    Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象,这篇文章主要介绍了redis的hash类型的详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • redis 实现登陆次数限制的思路详解

    redis 实现登陆次数限制的思路详解

    这篇文章主要介绍了redis 实现登陆次数限制的思路详解,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 使用lua+redis解决发多张券的并发问题

    使用lua+redis解决发多张券的并发问题

    这篇文章主要介绍了使用lua+redis解决发多张券的并发问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Redis中的AOF原理及分析

    Redis中的AOF原理及分析

    Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率
    2025-09-09
  • Redis 分片集群搭建与故障转移实战指南(推荐)

    Redis 分片集群搭建与故障转移实战指南(推荐)

    本文介绍了如何搭建一个最小的Redis分片集群,并详细描述了集群的启动、创建、测试、伸缩和故障转移过程,同时,还介绍了如何使用RedisTemplate访问分片集群,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • redis发布和订阅_动力节点Java学院整理

    redis发布和订阅_动力节点Java学院整理

    这篇文章主要为大家详细介绍了redis发布和订阅的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • redis底层数据结构之ziplist实现详解

    redis底层数据结构之ziplist实现详解

    这篇文章主要为大家介绍了redis底层数据结构之ziplist实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论