免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 965 | 回复: 0
打印 上一主题 下一主题

Boa实现多用户认证机制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-27 14:01 |只看该作者 |倒序浏览
  
Boa不支持Cookie,我们可以参考cgi_header.c中的process_cgi_header()函数,在其中可以看到Boa并没有处理与Cookie相关的头部信息,因此,即使向Boa发送了Set-Cookie头信息它也不会做任何事情,经过测试也确实如此.所以这种方法是不可行的。
最终,Boa所支持的HTTP认证方式成为了唯一的选择,首先,我们需要启动Boa对HTTP认证的支持,必须修改配置文件Boa.conf,例如有一个虚拟目录是/internal/,要求访问它的用户必须是经过HTTP认证的用户,那么只需要在boa.conf中添加:Auth /internal /etc/internal.passwd(如果这是最后一条必须换行),表示对/internal进行认证,密码文件在/etc/目录下,文件为internal.passwd.
建立多用户认证机制
用户合法性的验证工作是在auth_check_userpass()函数中进行的,所以可以设法修改源代码使其能够提供多用户认证机制.代码可以参考其应用于正常模式的方法,由于原作者是采用MD5加密后再经过Base64编码的方法来保存密码的,为了降低其复杂性也尽量减少对服务器运行速度的影响,在此使用了DES加密来代替MD5加密,经过这样的修改后源代码如下:
int auth_check_userpass(char *user,char *pass,FILE *authfile)
{
         char temps[0x100],*pwd;
         fseek(authfile,0,SEEK_SET);
         while (fgets(temps,0x100,authfile))
         {
                   if (temps[strlen(temps)-1]=='\n')
                            temps[strlen(temps)-1] = 0;
                   pwd = strchr(temps,':');
                   if (pwd)
                   {
                            *pwd++=0;
                            if (!strcmp(temps,user))
                            {
                                     if (!strcmp(pwd,crypt(pass,pwd)))
                                               return 0;
                            }
                   }
         }
         return 1;
}
这样修改后,函数每次从密码文件中读取一行,将其由”:”分为用户名和密码,当用户名一致时,对通过参数传递进来的密码由DES加密,然后和读取的密码比较以确定用户是否合法.当用户名不一致时读取下一行,直到文件结束.这样Boa就可以提供多用户认证的机制了.
        为用户名建立环境变量
        由于Boa不提供多用户认证,自然就没有提供针对HTTP认证的环境变量,所以当一个用户成功登录后,在服务器端看来它们并无法被区分,因此就很难对它们提供个性化的服务,所以必须为成功登录的用户提供一个环境变量来存储用户名,从而满足应用程序的要求.首先,要在request结构中添加一个变量auth_name用以存储用户名.其次,在auth_authorize()函数中将解码后的用户名拷贝到上一步所添加的变量当中.接下来在complete_env()函数中的合适位置添加如下语句:
#ifdef AUTH
if (req->auth_name)
        req->cgi_env[req->cgi_env_index++] =
                env_gen("AUTH_NAME", req->auth_name);
#endif
其中auth_name就是添加在request结构中的字符串变量,AUTH_NAME就是添加的环境变量的名称.在CGI应用程序中只需要使用getenv(“AUTH_NAME”)就能获得当前用户的用户名.
完成以上工作后,我们可以编写适当的CGI应用程序来完成用户的增加、删除以及用户密码的修改,从而实现了比较完整的用户认证体制。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/83703/showart_1844998.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP