前天看了一下ncsa_auth认证程序的源码,发现这个认证其实是非常简单的。
squid启动时运行ncsa_auth passwd密码文件
如果你的认证用户不是很多的话,写个sh就可以解决问题了
ncsa_auth.sh
内容如下
#认证用户名为abc密码123
[code:1:e0e520c5be]
while true ; do
read a
user=`echo a| /usr/bin/cut -d ' ' -f1`
pass=`echo a|/usr/bin/cut -d ' ' -f2`
if [ "$user" == "abc" ] ; then
if [ "$pass" == "123" ] ; then
echo OK;
else
echo ERR;
fi
else
echo ERR
fi
done
#结束
呵呵,如果你的认证不是很频繁的话。但是你希望与你的数据库认证集成在一起的话
你也可以用php连结数据库达到这个目的
在ncsa_auth.sh里的内容应该如下:
/usr/local/bin/php /usr/local/etc/ncsa_auth.php
在ncsa_auth.php内容
<?php
$fd = fopen('php://stdin', 'r');
while(true){
$buffer = fgets($fd, 4096);
$lsstr=explode(' ',$buffer);
$sql_str="select user from bbs_user where userid like '$lsstr[0]' and pass like '$lsstr[1]'";
#如果用户名与密码正确的话
if(true) echo 'OK';
else echo 'ERR';
}
?>
[/code:1:e0e520c5be]
抛砖引玉,希望大家在用squid认证能够有所启发,当然如果你觉得效率低下的话就使用C,直接修改squid自带的ncsa_auth.c加了数据库查询语句就行了。
ljily000 回复于:2005-03-06 21:11:31:em27:
顶!
Good!
段誉 回复于:2005-03-12 04:00:37顶上来,大家都了解一下。
BTW:请大家多多关注我们这个板子,多推荐好帖子,增加我们这个板子的精华数量。谢谢!!
shitian8848 回复于:2005-03-12 09:32:49正在弄squid的认证呢,呵呵,谢谢楼主了。
UP!
platinum 回复于:2005-03-12 10:45:27请教一下楼主
[code:1:4e08dde378]
while true ; do
read a
user=`echo a| /usr/bin/cut -d ' ' -f1`
pass=`echo a|/usr/bin/cut -d ' ' -f2`
if [ "$user" == "abc" ] ; then
if [ "$pass" == "123" ] ; then
echo OK;
else
echo ERR;
fi
else
echo ERR
fi
done
#结束
[/code:1:4e08dde378]
这个shell用于哪里?
好像和squid认证无关啊~
另外,ncsa的密码是MD5后的,而楼主这个shell是明码
我只是想知道,这个shell是做什么的呢?
60133056 回复于:2005-03-12 13:45:32观望 学习
wingger 回复于:2005-03-12 14:28:08[quote:7f7046b6b5="platinum"]这个shell用于哪里?
好像和squid认证无关啊~
另外,ncsa的密码是MD5后的,而楼主这个shell是明码
我只是想知道,这个shell是做什么的呢?[/quote:7f7046b6b5]
我也想知道,是用这个来代替ncsa吗?
还是解剖他的原理?
wxxszzz 回复于:2005-03-12 17:43:24看了上面大家的回贴,我就再解释一下吧。
我们使用htpasswd产生的那个密码文件里的密码是用MD5加密的。
但是squid传递给ncsa_auth认证程序的密码使用的是明码,
然后由ncsa_auth认证程序再用md5加密传给他的密码后
再与用htpasswd产生的那个密码文件里的密码相比较。
如果符合就认为密码正确。
另外以上的sh与使用php密码认证的程序。
就是接到squid的密码后,不使用md5加密接收到的密码,直接比较,
以上的两个程序
他们都是可以直接替代ncsa_auth这个认证程序的。
OK,如果还有疑问,可以再提问,不过我觉得SQUID他这样的认证是比较合理的。现时也比较直接明了,
设想一下,如果你的认证用户非常多,如有1000人以上同时认证,我们可以简单的使用上面的高级语言如C、php、perl、java等语言,只要他的代码里支持套接字sockets接口你就可以设计一个集中式的认证系统。
以PHP举例:
代码如顶搂的语言里只是稍微修改一下。
[code:1:d8bd213a3b]
在ncsa_auth.php内容
<?php
$fd = fopen('php://stdin', 'r');
while(true){
$buffer = fgets($fd, 4096);
$lsstr=explode(' ',$buffer);
#这里使用套接字把用户名与密码发送到后台认证中心去
$sfd=fscoket("x.x.x.x",)
write
read
fclose($sfd);
}
fclose($fd);
?>
[/code:1:d8bd213a3b]
这里之后,一个比较好的认证中心这可以产生了。之所以选用PHP认证,是因为这段时间用PHP比较多。
这样之后,你就可以使用多台SQUID,多台认证中心,一个中央数据库。
呵呵,不知道各位看过我的解释与说明之后,是不是有所启发呢?
没有做不到,只有想不到的事情。
platinum 回复于:2005-03-16 07:21:21这个是ncsa_auth.c的源代码
[code:1:2a9999c6f7]
/*
* ncsa_auth.c
*
* AUTHOR: Arjan de Vet <Arjan.deVet@adv.iae.nl>
*
* Example authentication program for Squid, based on the original
* proxy_auth code from client_side.c, written by
* Jon Thackray <jrmt@uk.gdscorp.com>.
*
* Uses a NCSA httpd style password file for authentication with the
* following improvements suggested by various people:
*
* - comment lines are possible and should start with a '#';
* - empty or blank lines are possible;
* - extra fields in the password file are ignored; this makes it
* possible to use a Unix password file but I do not recommend that.
*
*/
#include "config.h"
#if HAVE_STDIO_H
#include <stdio.h>