Chinaunix首页 | 论坛 | 博客
  • 博客访问: 199186
  • 博文数量: 48
  • 博客积分: 1430
  • 博客等级: 上尉
  • 技术积分: 640
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-29 13:24
文章分类

全部博文(48)

文章存档

2014年(2)

2013年(1)

2011年(1)

2009年(8)

2008年(36)

我的朋友

分类: LINUX

2009-02-27 14:01:44

 

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应用程序来完成用户的增加、删除以及用户密码的修改,从而实现了比较完整的用户认证体制。

阅读(4513) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-12-01 20:47:27

兄弟,我的boa没有auth.c文件,没有您说的auth_check_pass函数,您能给提供一个有auth.c文件的boa源码吗?我找了好几天都没下载到。谢谢啦~

chinaunix网友2009-03-23 17:05:53

博主兄弟,你好,看了你这篇文章感觉不错,我也在做嵌入式web多用户认证,用的是boa,有些问题想咨询下你, 不知道你是否欢迎 我的MSN:gxichun@hotmail.com