Redis源码分析系列十八:1 命令"auth"---authCommand

这个命令主要是密码验证信息,我们来看如何处理的,执行函数为authCommand。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

代码如下:

void authCommand(redisClient *c) 
{
if (!server.requirepass) 
{
addReplyError(c,"Client sent AUTH, but no password is set");

else if (!time_independent_strcmp(c->argv[1]->ptr, server.requirepass)) 
{
 c->authenticated = 1;
 addReply(c,shared.ok);

else 
{
 c->authenticated = 0;
 addReplyError(c,"invalid password");
}
}

看起来代码不多,我们细细研究。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

首先,我之前的文章为了简单,没有修改配置文件,导致redis是不需要密码验证的,

因为redis.conf配置文件里有一行是:

# requirepass foobared

那么为了密码验证如何做?

去掉#,然后把foobared修改为自己的密码即可!!!就是这么简单,

经理再也不用担心我的密码验证了!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

这样的话,server.requirepass就会指向自己的密码。

这样的话:

if (!server.requirepass) 
{
addReplyError(c,"Client sent AUTH, but no password is set");

就不会执行!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

然后我发现了一个函数:time_independent_strcmp,我们来看看干嘛的!

这个函数有一句话解释:/* Return zero if strings are the same, non-zero if they are not.

也就是,相同返回0,不同返回1

很多不是特别重要的函数,大家没必要去看,把握主干就可以,要从宏观去认识一个事物,

吾生有涯而知识无涯啊!!!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

else if (!time_independent_strcmp(c->argv[1]->ptr, server.requirepass)) 
{
 c->authenticated = 1;
 addReply(c,shared.ok);

如果密码相同,则设置authenticated为1

那么addReply(c,shared.ok);是干嘛的?从字面上理解为增加响应。

为什么这个时候不发送给客户呢?我写这篇文章时还没有看完整,

但是我之前碰到过一个事务的概念,我猜可能有的时候会执行多个命令,

把每个命令的响应放在一起再一次性发回。后面再验证。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

现在来理解addReply.

prepareClientToWrite函数的核心是给socket fd开启写句柄函数。

aeCreateFileEvent(server.el, c->fd, AE_WRITABLE,sendReplyToClient, c);

也就是说使用sendReplyToClient函数来处理。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

shared.ok的encoding是:REDIS_ENCODING_RAW

所以会执行:

if (_addReplyToBuffer(c,obj->ptr,sdslen(obj->ptr)) != REDIS_OK)
_addReplyObjectToList(c,obj);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

_addReplyToBuffer函数又是如何运行的呢?

不急着看代码,我又重新看了下RedisClient的代码。

 /* Response buffer */
int bufpos;
//已经写的数据字节数
char buf[REDIS_REPLY_CHUNK_BYTES];
//这个缓冲区用来存储发送的数据
先把这两个成员变量弄清楚。

然后看代码,不难理解,就是把"+OK\r\n"复制到缓冲区里。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

汗,这个命令竟然就这么简单的执行完毕,这也太土豪了吧!

总结:

客户发: auth mypassword

服务器:

          成功1: +OK\r\n

          失败1:-ERR Client sent AUTH, but no password is set\r\n

          失败2:-ERR invalid password\r\n



你可能感兴趣的:(redis,redis,强子哥哥,qiangzigege)