寻找Linux下的优秀工具和集成这些工具的方法 注册 | 登陆

更进一步:squid基于mysql的用户+ip绑定认证

昨天写的《用php写一个squid验证辅助器(authentication helper)》实现了squid基于mysql的用户帐号认证,今天再进一步修改一下程序,支持基于mysql的用户+ip绑定认证功能。

使用/etc/squid/acl_valid_user.txt存放用户的ip和帐号信息,ip和帐号以空格分隔,这里的帐号与mysql数据表里的用户帐号是一致的,格式如下:

acl_valid_user.txt
  1. 192.168.1.100 pangty
  2. 192.168.1.200 test  

相应的修改squid.conf,使用ip_user_check来进行帐号与ip的关联检查:

squid.conf相关配置
  1. external_acl_type ip_user_check children=5 %SRC %LOGIN /usr/lib/squid/ip_user_check -f /etc/squid/acl_valid_user.txt   
  2. acl acl_ip_user_check external ip_user_check   
  3.   
  4. acl acl_valid_user proxy_auth REQUIRED   
  5. http_access allow acl_valid_user acl_ip_user_check   
  6. http_access deny all   
  7.   
  8. auth_param basic program /usr/lib/squid/my_auth.php   
  9. auth_param basic children 5   
  10. auth_param basic realm 互联网访问权限验证   
  11. auth_param basic credentialsttl 2 hours   
  12. auth_param basic casesensitive on   

my_auth.php验证辅助程序加入对acl_valid_user.txt的验证,原来在mysql里创建的squid表作废。

my_auth.php
  1. #!/usr/bin/php   
  2.   
  3. <?php   
  4. ini_set("display_errors", false);   
  5.   
  6. $datafile = "/etc/squid/acl_valid_user.txt";   
  7.   
  8. function valid($u$p$sql_link) {   
  9.         $result = false;   
  10.         $res = mysql_query("select pw_passwd from vpopmail where pw_name='$u'"$sql_link);   
  11.         $rows = mysql_num_rows($res);   
  12.         if (1 == $rows) {   
  13.                 $data = mysql_fetch_object($res);   
  14.                 $passwd = $data->pw_passwd;   
  15.                 if ($passwd == crypt($p$passwd)) {   
  16.                         $result = true;   
  17.                 }   
  18.         }   
  19.         return $result;   
  20. }   
  21.   
  22. $data = file_get_contents($datafile);   
  23. $line = preg_split ("/\n/"$data);   
  24. foreach ($line as $l) {   
  25.         $l = trim($l);   
  26.         if (!emptyempty($l)) {   
  27.                 list($k$v) = preg_split("/ +|\s+/"$l);   
  28.                 $userarr[$v] = $k;   
  29.         }   
  30. }   
  31.   
  32. while (!feof(STDIN)) {   
  33.         $sql_link = mysql_connect("x.x.x.x""xxx""yyy");   
  34.         mysql_select_db("vpopmail"$sql_link);   
  35.  
  36.         $input = trim(fgets(STDIN));   
  37.         list($u$p) = split(" "$input);   
  38.         $username = rawurldecode($u);   
  39.         $password = rawurldecode($p);   
  40.         if (array_key_exists($username$userarr) && valid($username$password$sql_link)) {   
  41.                 fwrite(STDOUT, "OK\n");   
  42.         } else {   
  43.                 fwrite(STDOUT, "ERR\n");   
  44.         }   
  45.  
  46.         mysql_close($sql_link);   
  47. }   
  48.   
  49. ?>   

« 上一篇 | 下一篇 »

引用

点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5

发表评论

评论内容 (必填):