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